From 02c84ca99c18e60055618e9feb518c07adbc91bf Mon Sep 17 00:00:00 2001 From: Sei Lisa Date: Mon, 28 Jul 2014 18:19:50 +0200 Subject: [PATCH] Add default options and option activation/deactivation. --- main.py | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/main.py b/main.py index 92678d5..e994796 100644 --- a/main.py +++ b/main.py @@ -9,37 +9,39 @@ def main(): if len(sys.argv) < 2: sys.stderr.write(r'''LSL optimizer v0.1 -Usage: %s [-O option[,option[,...]]] filename +Usage: %s [-O [+|-]option[,[+|-]option[,...]]] filename +That's an upper case o, not the number zero. If filename is a dash (-) then standard input is used. -Options (* means not implemented): - extendedglobalexpr Enables arbitrary expressions in globals (as opposed to +Options (+ means default, - means not default, * means not implemented): + +extendedglobalexpr Enables arbitrary expressions in globals (as opposed to dull simple expressions allowed by regular LSL). Needs the optimizer to run for the result to be compilable. - extendedtypecast Allows extended typecast syntax e.g. (string)(integer)a + +extendedtypecast Allows extended typecast syntax e.g. (string)(integer)a is valid with this option. - extendedassignment Enables &=, |=, ^=, <<=, >>= assignment operators. - explicitcast Add explicit casts where they are implicit. This option + +extendedassignment Enables &=, |=, ^=, <<=, >>= assignment operators. + -explicitcast Add explicit casts where they are implicit. This option is useless with 'optimize' and 'optsigns', and is of basically no use in general. - allowkeyconcat Allow string + key and key + string (both return string) - allowmultistrings Allow C-like string juxtaposition, e.g. "ab" "cd" means + +allowkeyconcat Allow string + key and key + string (both return string) + +allowmultistrings Allow C-like string juxtaposition, e.g. "ab" "cd" means "abcd", no concatenation involved. Very useful when used with a preprocessor (although the optimizer would optimize concatenated strings if they are parenthesized correctly, see note at the footer). - skippreproc Skip preprocessor directives in the source as if they + +skippreproc Skip preprocessor directives in the source as if they were comments. Not useful unless the script is itself the output of a preprocessor like cpp, which inserts directives like: # 123 "filename". - optimize Runs the optimizer. - optsigns Optimize signs and float as int. - foldtabs Tabs can't be copy-pasted, so they aren't optimized by + +optimize Runs the optimizer. + +optsigns Optimize signs and float as int. + -foldtabs Tabs can't be copy-pasted, so they aren't optimized by default. But with support from the viewer, they can be folded too and make it to the uploaded source. This option overrides that check, enabling optimization of - strings with tabs. + strings with tabs. The resulting source isn't guaranteed + to be copy-paste-able to a different script, though. * allowcescapes Enables use of \r, \b, \xNN, \NNN, etc. * enableswitch Enables Firestorm-compatible switch statements (not recommended) @@ -52,14 +54,24 @@ means that e.g. a + 3 + 5 is not optimized to a + 8; however a + (3 + 5) is. ''' % sys.argv[0]) return 1 + options = set(('extendedglobalexpr','extendedtypecast','extendedassignment', + 'allowkeyconcat','allowmultistrings','skippreproc','optimize','optsigns' + )) + if sys.argv[1] == '-O': if len(sys.argv) < 4: sys.stderr.write('Command line: Not enough parameters\n') return 1 - options = sys.argv[2].split(',') + optchanges = sys.argv[2].split(',') + for chg in optchanges: + if chg[0:1] != '+': + chg = '+' + chg + if chg[0] == '-': + options.discard(chg[1:]) + else: + options.add(chg[1:]) fname = sys.argv[3] else: - options = () fname = sys.argv[1] p = parser()