Functions ^

static list *new_list(char const *const first_item)

Create a new list node. The specified item is assigned to the node's value. Returns the newly created node.

static list *add_item(list *const L, char const *const item)

Add a new item to the specified list. The item is added at the back of the list, so items added are kept in order.

A pointer to the beginning of the list is returned (the same as was specified).

static void include_file(char const *const filename, lexer_state *const lexer, int currentline)

Process the specified file.

static void update_unique_id(lexer_state *const lexer)

static void expand(yyscan_t yyscanner, macro_def *const macro, list *args, lexer_state *const lexer)

Expand the specified macro (or constant).

static void define_constant(constant_table *const table, char const *const name, char const *const value)

void define_macro(constant_table *const table, char *const name, list *const parameters)

Define a macro by the given name, parameters and body.

macro_def *find_macro(constant_table *const table, char *const name)

Find the specified macro. If the specified macro does not exist, NULL is returned.

static char const *concat(char const *str1, char const *str2, int need_space)

Concatenate two strings, and return the result. If the first string is NULL, then the result consists of the second string. If need_space is true, a space is inserted between the two strings.

static char *concatn(int need_space, unsigned numargs, ...)

Concatenate numargs strings together into one new string. If need_space is non-zero, the strings are separated by a space.

static void emit(lexer_state *const lexer, char const *const str)

Emit the specified string. This function will be the "gateway" to the output file. All tokens except .sub, .end and .namespace are indented. All tokens are separated with a space, ), ], ,.

static void emitf(lexer_state *const lexer, char const *const str, ...)

new_constant_table

pop_constant_table

delete_constant_table

munge_id

Generate an identifier based on a macro label or locaal declaration, or a macro label or local expansion.

A label declaration looks like: ".label $LABEL:", from which a normal PIR label is created, formatted as: "_unique_MACRO_LABEL_?:".

A label expansion looks like ".$LABEL", from which a label identifier is generated, formatted as: "_unique_MACRO_LABEL_?" (note the difference, there is no colon at the end.

The same works for local identifiers, but of course the is_label_declaration argument must be 0 for that.

static void process_string(char *const buffer, lexer_state *const lexer)

Process the string stored in buffer. First a new yyscan_t object is created, initialized, after which the specified buffer is parsed. Afterwards the yyscan_t object is destroyed.

static void process_file(char const *const filename, lexer_state *const lexer)

Process the specified file.

static void print_help(char const *const programname)

int yyerror(yyscan_t yyscanner, lexer_state *const lexer, char const *const message, ...)

Function for syntax error handling.

int main(int argc, char *argv[])

Pre-processor main function.


parrot