Mostly Harmless

UE1:UE1PreProcessor

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

About[edit]

This is simple preprocessor for UnrealEngine 1. It was inspired by UnrealEngine 3 build-in preprocessor.

Install[edit]

Copy files in the archive to your <Udir>/system folder.

Download[edit]

link: http://turniej.unreal.pl/files/uenginepp.zip (~570 kb)

Usage[edit]

Directives[edit]

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[edit]

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

Commandline parameters[edit]

You can use uenginepp by typing in console following command:

uenginepp <project_dir>/<project_file> <modifiers>

where:

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


modifiers:

-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[edit]

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

<project_folder>/classes_ucp

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)
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)

example:

[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

Date[edit]

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

Example[edit]

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:

  1. directive `process is found, so preprocessor knows that this class has to be parsed.
  2. directive `define is found. Preprocessor assign to const int1 value 120
  3. directive `define is found. Preprocessor assign to const int1 value 123
  4. directive `define is found. Preprocessor assign to const nc value var() class<actor> NewActor;
  5. 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
  6. it detects `else directive. preprocessor stops deleting lines and searches for next directives
  7. var() int test2; is not detected as directive so it's left alone
  8. directive `write is detected. preprocessor searches for variable named nc and (if found) writes it in .uc file
  9. 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.

Changelog[edit]

  • v 0.1.2
    • added new macros
  • v 0.1.1
    • fixed parser
  • v 0.1.2
    • initial release