I love the smell of UnrealEd crashing in the morning. – tarquin

UE1:UE1PreProcessorCommandlet

From Unreal Wiki, The Unreal Engine Documentation Site
Revision as of 12:12, 21 September 2008 by Raven (Talk | contribs) (Macros)

Jump to: navigation, search

About

This is preprocessor in form of ucc commandlet.

Install

Copy files in the archive to your <UTdir> folder.

Download

link: http://turniej.unreal.pl/files/UEnginePPC.zip (~93 kb)

Usage

In order to use preprocessor you have to call ucc with following parameters:

ucc uengineppc.parse project=[<project_dir>/<project_file>]  [-option...] [-globals...]

Parameters

  • <project_dir> - relative project directory.
  • <project_file> - file (.upc extension) conaining all options. If file is detected, no fuhrer modifiers are checked

Options

  • -clean - deletes preprocessor directives from .uc file
  • -debug - turns on debug mode (prints every operation on parsed .uc file)
  • -printglobals - prints all global variables
  • -normalizeeol - tries to find \r and \n and change them into \r\n

Globals

Each other parameter will be concidered as global variable. If = is not detected, global variable is equal null. Example:

   val1=1 val val2=3 

Directives

Currently supported directives are:

  • `process - should be in the first line of .uc file. Tells preprocessor to parse file
  • `include(file) - embade file in the currently opened .uc (do not parses it)
  • `include(file,false) - embade file in the currently opened .uc (do not parses it)
  • `include(file,true) - embade file in the currently opened .uc and parses it
  • `require(file) - embade file in the currently opened .uc (do not parses it). If required file doesn't exists, it stops parsing current file and produce error.
  • `require(file,false) - embade file in the currently opened .uc (do not parses it). If required file doesn't exists, it stops parsing current file and produce error.
  • `require(file,true) - embade file in the currently opened .uc and parses it. If required file doesn't exists, it stops parsing current file and produce error.
  • `define(name) - defines variable name (used in `ifdef and `ifndef directives)
  • `define(name=value) - defines variable name with specified value (used in `if and ternary operation)
  • `undef(name) - removes name from local definitions
  • `error(name1,true) - produces error message and exits commandlet
  • `error(name1) - produces error message and stops parsing current file
  • `warn(name1) - produces warning message
  • `log(name1) - produces message
  • `ifdef(name) - evaluates to true if variable name is defined
  • `ifndef(name) - evaluates to true if variable name is not defined
  • `if(name1==name2) - evaluates to true if variable name1 equals variable name2. Used in strings, floats, integers.
  • `if(name1<name2) - evaluates to true if variable name1 does not match variable name2. Used in strings, floats, integers.
  • `if(name1>name2) - evaluates to true if variable name1 is greater then variable name2. Used in floats, integers.
  • `if(name1<name2) - evaluates to true if variable name1 is less then name2. Used in floats, integers.
  • `else - part of conditional statement
  • `endif - ends conditional statement
  • `write(name) - writes defined variable name
  • `write(name1==name2option1:option2) - if statemente evaluate to true (variable name1 equals variable name2) writes option1 otherwise writes option 2
  • `write(name1<>name2?option1:option2) - if statemente evaluate to true (variable name1 does not match variable name2) writes option1 otherwise writes option 2
  • `write(name1>name2?option1:option2) - if statemente evaluate to true (variable name1 is greater then variable name2) writes option1 otherwise writes option 2
  • `write(name1<name2?option1:option2) - if statemente evaluate to true (variable name1 is less then variable name2) writes option1 otherwise writes option 2
  • `write(name1?option1:option2) - if statemente evaluate to true (variable name1 is defined) writes option1 otherwise writes option 2

Notice that all variables used in directive `if and trenary operation are parsed in following order:

  1. Returns value from global variables if correct name is found, otherwise...
  2. Returns value from local variables if correct name is found, otherwise...
  3. Assumes that name is value.

Macros

Macros are in fact hardcoded constants. Each macro will write something in currently parsed .uc file. Currently supported macros are:

  • __FILE__ - will write name of currently parsed file
  • __CLASS__ - will write name of currently parsed class
  • __DATE__ - will write time

Project file

Project file must have upc extension, and 'path' must be relative to ucc.exe location. Default location to files with preprocessor Unreal Script files is:

<project_folder>/classes/preprocessor

parsed .uc files will be stored in:

<project_folder>/classes

Here's all commands for project file.


[project]                 - project informations
path=path                 - path to project
debug=true                - turns on debug mode (prints every operation on parsed .uc)
clean=true                - if true will delete preprocessor directives
output=folder             - override default output folder where parsed .uc files are written
input=folder              - override default input folder where parsed .uc files are stored
 
[globals]                 - group contatin global variables for whole project
someglobal=somevalue      - global variable (sample)

example:

[project]
path=../MyProject/
debug=true
make=true
make_ini=make.ini
clean=true
output=classes
input=classes/preprocessor
 
[globals]
global_value1=test1
global_value2=test2

Example

Let's say you have project file in <UDir>/system called REmitter.upc with content:

[project]
path=../REmitter/
debug=true
make=false
make_ini=make.ini
clean=true
output=classes
input=classes/preprocessor
printglobals=true
 
[globals]
__NUM_NATIVES__=1

and classes:

REmitterBase.uc

`process
`include(classes/includes/default_header.uc,true)
// Base class for emitter related actors.
// Quaternion implementation originally written by UsAaR33.
class REmitterBase extends Actor native;
 
struct Quat
{
	var() config float W, X, Y, Z;
};
//converts rotator to quaternion
native`write(__NUM_NATIVES__==1?(2330):) static final function Quat RotationToQuat( rotator R, bool bHighPrecision);

default_header.uc

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Copyright 2005-2008 Dead Cow Studios. All Rights Reserved.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Coder: Raven
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Last revision: __DATE__
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You run preprocessor and:

  1. directive `process is found, so preprocessor knows that this class has to be parsed.
  2. directive `include is found. Preprocessor embade file default_header.uc and parses it
  3. macro __DATE__ is found and current date is inserted at its place
  4. directive `write is found. Because expression evaluates to ture first value - (2330) - is inserted at it's place

output .uc file in classes will look like this:

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Copyright 2005-2008 Dead Cow Studios. All Rights Reserved.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Coder: Raven
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Creation date: __FILE_DATE__
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Last revision: 21-9-2008 20:1
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// Base class for emitter related actors.
// Quaternion implementation originally written by UsAaR33.
class REmitterBase extends Actor native;
 
struct Quat
{
	var() config float W, X, Y, Z;
};
//converts rotator to quaternion
native(2330) static final function Quat RotationToQuat( rotator R, bool bHighPrecision);

Changelog

  • v 0.1.1
    • initial release