There is no spoon
This is simple preprocessor for UnrealEngine 1. It was inspired by UnrealEngine 3 build-in preprocessor.
Copy files in the archive to your <Udir>/system folder.
link: http://turniej.unreal.pl/files/uenginepp.zip (~570 kb)
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 `inc_process file - embade file in the currently opened .uc and parses it `define variable - defines empty variable (used in `ifdef and `ifndef directives) `define variable=value - defines variable with specified value `write variable - writes defined variable `ifdef variable - evaluates to true if variable is defined `ifndef variable - evaluates to true if variable is not defined `else - part of conditional statement `endif - ends conditional statement `check definition==value - evaluates to true if defined variable (definition) equals value. Used in strings, floats, integers. `check definition<>value - evaluates to true if defined variable (definition) does not match value. Used in strings, floats, integers. `check definition>value - evaluates to true if defined variable (definition) is greater then value. Used in floats, integers. `check definition<value - evaluates to true if defined variable (definition) is less then value. Used in floats, integers.
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
You can use uenginepp by typing in console following command:
uenginepp <project_dir>/<project_file> <modifiers>
<project_dir> - relative project directory. <project_file> - file (.upc extension) conaining all options. If file is detected, no fuhrer modifiers are checked.
-clean - deletes preprocessor directives from .uc file -debug - turns on debug mode (prints every operation on parsed .uc file) -make <ini file> - runs ucc.exe with specified ini -h - prints help -global someglobal=somevalue - defines global variable -printglobals - show defined global variables
Project file must have upc extension, and 'path' must be relative to uenginepp.exe location. Default location to files with preprocessor headers is:
parsed .uc files will be stored in:
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) make=true - if true, ucc will be executed make_ini=ini_file.ini - if present runs ucc.exe with specified ini 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 printglobals=true - show defined global variables dateformat=m.d.y - date format (look below for all examples) [globals] - group contatin global variables for whole project someglobal=somevalue - global variable (sample)
[project] path=../MyProject/ debug=true make=true make_ini=make.ini clean=true output=classes input=classes_ucp printglobals=true dateformat=m.d.y [globals] global_value1=test1 global_value2=test2
You can use following date formats:
// Assuming today is: February 12th, 2008, 19:16:18 F j, Y, g:i a - February 12th, 2008, 7:16 pm m.d.y - 01.12.08 m-d-y, H:i:s - 01-12-08, 17:16:17 j, n, Y - 12, 1, 2008 D M j G:i:s T Y - Sat Feb 12 19:16:08 MST 2008 H:i:s - 17:16:17
Let's say you have project file in <UDir>/system called RUI.upc with content:
[project] path=../RComputerUI/ debug=true make=true make_ini=make.ini clean=true output=classes input=classes_ucp
whe you'll call uenginepp.exe RUI.upc parser will process all files in classes_ucp, and generates output code in classes, which will be striped out (or not) from preprocessor directives. Let's say you have class:
`process `define int1=120 `define int2=123 `define nc=var() class<actor> NewActor; class PreProcessorTest extends Actor; `check int1>int2 var() int test1; `else var() int test2; `write nc `endif
You run preprocessor and:
- directive `process is found, so preprocessor knows that this class has to be parsed.
- directive `define is found. Preprocessor assign to const int1 value 120
- directive `define is found. Preprocessor assign to const int1 value 123
- directive `define is found. Preprocessor assign to const nc value var() class<actor> NewActor;
- it detects `check directive and compare int1 and int2. because int1 is smaller then int2, expression evaluates to false and all next lines are skipped and deleted
- it detects `else directive. preprocessor stops deleting lines and searches for next directives
- var() int test2; is not detected as directive so it's left alone
- directive `write is detected. preprocessor searches for variable named nc and (if found) writes it in .uc file
- directive `endif stops conditional expression
output .uc file in classes will look like:
class PreProcessorTest extends Actor; var() int test2; var() class<actor> NewActor;
Same output code with clean turned off:
//`#process //`#define int1=120 //`#define int2=123 //`#define nc=var() class<actor> NewActor; class PreProcessorTest extends Actor; //`#check int1>int2 //`#var() int test1; //`#else var() int test2; var() class<actor> NewActor; //`#write nc //`#endif
Of course input file can look different, but most important thing is to write `process in first line.
- v 0.1.2
- added new macros
- v 0.1.1
- fixed parser
- v 0.1.2
- initial release