INTRODUCTION ============ This file explains what is and how to use the #pragma directive with Harbour. Primarily, it gives you control over the compiler's command-line switches within your source code. WHAT IS ======= The #pragma is a directive used inside the source code in many compilers to change the behavior of the compiler at compile time. USAGE ===== Currently the #pragma directive can be used in two ways: the switch mode and the command mode. The syntax is: #pragma [=On/Off] or #pragma -CompilerFlag[+|-] You can use both modes mixed in the same module and upper/lower case without worry. To enable or disable a command or a switch you simply do: * Command mode Switch mode -------------------------------------------------------------- * #pragma =On/Off #pragma /+/- Example: #pragma DebugInfo=Off /* Suppress debug info */ #pragma /B+ /* Add debug info from here */ IMPLEMENTATION ============== This is the list of the supported commands and switches: * Command Switch ----------------------------------------------- * AUTOMEMVAR = -a<+/-> * DEBUGINFO = -b<+/-> * DYNAMICMEMVAR = -v<+/-> * ENABLEWARNINGS = -w<+/-> * ESCAPEDSTRINGS = * EXITSEVERITY = -es * LINENUMBER = -l<+/-> * NOSTARTPROC = -n (read-only) * PREPROCESSING = -p<+/-> * SHORTCUT = -z<+/-> * TEXTHIDDEN = * TRACE = -p+ * WARNINGLEVEL = -w The switches have the same behavior as the corresponding compiler ones and the commands are synonyms for the switches. * TRACEPRAGMAS This command shows pragma activity at compile time when enabled. NOTE: You can use the abbreviated command mode by typing only the first eight chars. NOTES ===== This directive is not supported in the standalone version of the Harbour preprocessor. EXAMPLES ======== #pragma linenumber=off /* #pragma -l */ This is the same as calling Harbour with the -l switch in the command-line, but with the great benefit that if you forgot to pass the switch, it will be used anyway because it is included inside the source. =========== 1999-12-01 Regards, Jose Lalin SPECIAL PRAGMAS =============== These pragmas allows to control the processing of PRG source within the preprocessor. The special handling is done with a text enclosed between the '#pragma ' and '#pragma __endtext' #pragma __text -------------- Syntax: #pragma __text '|' [LineOutputCode] '|' [FinallyCode] '|' [StartupCode] Every line of text is stringified using '[' and ']' markers and is passed to 'LineOutputCode' using C '%s' formatting code. The result text is passed further to the syntax analyzer. The 'StartupCode' is returned at the very beginning of processing. The 'FinallyCode' is returned at the end. If 'LineOutputCode' is omitted then all lines are ignored. For example, this pragma is used to implement TEXT/ENDTEXT command #command TEXT => #pragma __text|QOut(%s)|QQOut() #command TEXT TO PRINTER => ; #pragma __text|QOut(%s)|__TextRestore()|__TextSave("PRINTER") #command TEXT TO FILE => ; #pragma __text|QOut(%s)|__TextRestore()|__TextSave(<"file">) ? #xcommand TEXT INTO => #pragma __text|+=%s+hb_eol();:="" ? #pragma __stream ---------------- Syntax: #pragma __stream '|' [JoinLineCode] '|' [EndingCode] '|' [StartingCode] All lines are joined together. The result text is stringified and is appended to 'StartingCode'. Finally the 'EndingCode' is appended. The resulting text is returned for further syntax analysis. For example: #command TEXT TO VAR => ; #pragma __stream|%s||:= ? #xcommand TEXT TO VAR => #pragma __stream|:=%s ? TEXT TO VAR v This is 'example' text with ''""[] embedded ENDTEXT The above example is preprocessed into: v:=[This is 'example' text with ''""[] embedded] #pragma __cstream ---------------- Syntax: #pragma __cstream '|' [JoinLineCode] '|' [EndingCode] '|' [StartingCode] This is similar to '#pragma __stream' with the additional conversion of C Esc sequences e.g \n \t \r \b For example: #command TEXT TO VAR => ; #pragma __cstream|%s||:= TEXT TO VAR v This is 'example' text with ''""[] embedded and C \n sequence ENDTEXT ? v The above example is preprocessed into: v:=[This is 'example' text with ''""[] embedded and C \nsequence] QOut(v) and at runtime the following is printed: This is 'example' text with ''""[] embedded and C sequence #pragma __endtext ----------------- Syntax: #pragma __endtext This pragma is used to finish the special processing defined with #pragma [__text | __stream | __cstream] The following command is hardcoded in the preprocessor: #xcommand ENDTEXT => #pragma __endtext #pragma RECURSELEVEL -------------------- Syntax: #pragma RECURSELEVEL This pragma sets the maximum number of preprocess iterations during the source code translation. The default value is 1024. This is the same as /r= command-line switch For example: #pragma RECURSELEVEL 2048