// // aegis - project change supervisor // Copyright (C) 1997-1999, 2002-2008 Peter Miller // Copyright (C) 2007 Walter Franzini // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include #include #include #include #include #include #include #include // must be last static arglex_table_ty argtab[] = { { "!", arglex_token_not, }, { "!=", arglex_token_ne, }, { "#", arglex_token_stringize, }, { "##", arglex_token_join, }, { "%", arglex_token_mod, }, { "&", arglex_token_bit_and, }, { "&&", arglex_token_and, }, { "(", arglex_token_left_paren, }, { ")", arglex_token_right_paren, }, { "+", arglex_token_plus, }, { ", ", arglex_token_comma, }, { "-Acess_Time", arglex_token_atime, }, { "-And", arglex_token_and, }, { "-Change_Time", arglex_token_ctime, }, { "-Debug", arglex_token_debug, }, { "-EXecute", arglex_token_execute, }, { "-Equals", arglex_token_eq, }, { "-Greater_Than", arglex_token_gt, }, { "-Greater_than_or_Equal", arglex_token_ge, }, { "-Less_Than", arglex_token_lt, }, { "-Less_than_or_Equal", arglex_token_le, }, { "-Modify_Time", arglex_token_mtime, }, { "-NEWer", arglex_token_newer, }, { "-Name", arglex_token_namekw, }, { "-Not", arglex_token_not, }, { "-Not_Equal", arglex_token_ne, }, { "-Or", arglex_token_or, }, { "-PAth", arglex_token_path, }, { "-PRInt", arglex_token_print, }, { "-Resolve", arglex_token_resolve, }, { "-Not_Resolve", arglex_token_resolve_not, }, { "-Size", arglex_token_size, }, { "-Type", arglex_token_type, }, { ".EQ.", arglex_token_eq, }, { ".GE", arglex_token_ge, }, { ".GT.", arglex_token_gt, }, { ".LE.", arglex_token_le, }, { ".LT.", arglex_token_lt, }, { ".NE.", arglex_token_ne, }, { "/", arglex_token_div, }, { ";", arglex_token_semicolon, }, { "<", arglex_token_lt, }, { "<<", arglex_token_shift_left, }, { "<=", arglex_token_le, }, { "=", arglex_token_eq, }, { "==", arglex_token_eq, }, { ">", arglex_token_gt, }, { ">=", arglex_token_ge, }, { ">>", arglex_token_shift_right, }, { "\\*", arglex_token_mul, }, { "^", arglex_token_bit_xor, }, { "_FAlse", arglex_token_false, }, { "_NOW", arglex_token_now, }, { "_TRue", arglex_token_true, }, { "{}", arglex_token_this, }, { "{+}", arglex_token_this_resolved, }, { "{-}", arglex_token_this_unresolved, }, { "|", arglex_token_bit_or, }, { "||", arglex_token_or, }, { "~", arglex_token_tilde, }, ARGLEX_END_MARKER }; static int number_of_errors; void cmdline_lex_open(int argc, char **argv) { arglex2_init3(argc, argv, argtab); number_of_errors = 0; } int cmdline_lex() { switch (arglex()) { case arglex_token_eoln: trace(("arglex_token_eoln\n")); return 0; case arglex_token_number: trace(("arglex_token_number\n")); cmdline_lval.lv_number = arglex_value.alv_number; return NUMBER; #if 0 case arglex_token_double: trace(("arglex_token_double\n")); cmdline_lval.lv_real = arglex_value.alv_double; return REAL; #endif case arglex_token_string: trace(("arglex_token_string\n")); cmdline_lval.lv_string = str_from_c(arglex_value.alv_string); return STRING; case arglex_token_and: trace(("arglex_token_and\n")); return ANDAND; case arglex_token_atime: trace(("arglex_token_atime\n")); return ATIME; case arglex_token_baseline: trace(("arglex_token_baseline\n")); return BASELINE; case arglex_token_base_relative: trace(("arglex_token_base_relative\n")); return BASE_REL; case arglex_token_bit_and: trace(("arglex_token_bit_and\n")); return BIT_AND; case arglex_token_bit_or: trace(("arglex_token_bit_or\n")); return BIT_OR; case arglex_token_bit_xor: trace(("arglex_token_bit_xor\n")); return BIT_XOR; case arglex_token_branch: trace(("arglex_token_branch\n")); return BRANCH; case arglex_token_change: trace(("arglex_token_change\n")); return CHANGE; case arglex_token_comma: trace(("arglex_token_comma\n")); return COMMA; case arglex_token_ctime: trace(("arglex_token_ctime\n")); return CTIME; case arglex_token_current_relative: trace(("arglex_token_current_relative\n")); return CUR_REL; case arglex_token_debug: trace(("arglex_token_debug\n")); return DEBUG_keyword; case arglex_token_div: trace(("arglex_token_div\n")); return DIV; case arglex_token_eq: trace(("arglex_token_eq\n")); return EQ; case arglex_token_execute: trace(("arglex_token_execute\n")); return EXECUTE; case arglex_token_false: trace(("arglex_token_false\n")); return FALSE_keyword; case arglex_token_ge: trace(("arglex_token_ge\n")); return GE; case arglex_token_grandparent: trace(("arglex_token_grandparent\n")); return GRANDPARENT; case arglex_token_gt: trace(("arglex_token_gt\n")); return GT; case arglex_token_help: trace(("arglex_token_help\n")); return HELP; case arglex_token_stringize: trace(("arglex_token_stringize\n")); return STRINGIZE; case arglex_token_join: trace(("arglex_token_join\n")); return JOIN; case arglex_token_le: trace(("arglex_token_le\n")); return LE; case arglex_token_left_paren: trace(("arglex_token_left_paren\n")); return LPAREN; case arglex_token_library: trace(("arglex_token_library\n")); return LIBRARY; case arglex_token_lt: trace(("arglex_token_lt\n")); return LT; case arglex_token_mod: trace(("arglex_token_mod\n")); return MOD; case arglex_token_mtime: trace(("arglex_token_mtime\n")); return MTIME; case arglex_token_mul: trace(("arglex_token_mul\n")); return MUL; case arglex_token_namekw: trace(("arglex_token_namekw\n")); return NAME; case arglex_token_ne: trace(("arglex_token_ne\n")); return NE; case arglex_token_newer: trace(("arglex_token_newer\n")); return NEWER; case arglex_token_not: trace(("arglex_token_not\n")); return NOT; case arglex_token_now: trace(("arglex_token_now\n")); return NOW; case arglex_token_or: trace(("arglex_token_or\n")); return OROR; case arglex_token_path: trace(("arglex_token_path\n")); return PATH; case arglex_token_plus: trace(("arglex_token_plus\n")); return PLUS; case arglex_token_print: trace(("arglex_token_print\n")); return PRINT; case arglex_token_project: trace(("arglex_token_project\n")); return PROJECT; case arglex_token_resolve: trace(("arglex_token_resolve\n")); return RESOLVE; case arglex_token_resolve_not: trace(("arglex_token_resolve_not\n")); return RESOLVE_NOT; case arglex_token_right_paren: trace(("arglex_token_right_paren\n")); return RPAREN; case arglex_token_semicolon: trace(("arglex_token_semicolon\n")); return SEMICOLON; case arglex_token_size: trace(("arglex_token_size\n")); return SSIZE; case arglex_token_stdio: trace(("arglex_token_stdio\n")); return MINUS; case arglex_token_this: trace(("arglex_token_this\n")); cmdline_lval.lv_number = -1; return THIS; case arglex_token_this_unresolved: trace(("arglex_token_this\n")); cmdline_lval.lv_number = 0; return THIS; case arglex_token_this_resolved: trace(("arglex_token_this\n")); cmdline_lval.lv_number = 1; return THIS; case arglex_token_tilde: trace(("arglex_token_tilde\n")); return TILDE; case arglex_token_trace: trace(("arglex_token_trace\n")); return TRACE; case arglex_token_true: trace(("arglex_token_true\n")); return TRUE_keyword; case arglex_token_trunk: trace(("arglex_token_trunk\n")); return TRUNK; case arglex_token_type: trace(("arglex_token_type\n")); return TYPE; case arglex_token_verbose: trace(("arglex_token_verbose\n")); return DEBUG_keyword; case arglex_token_version: return VERSION; default: trace(("JUNK\n")); return JUNK; } } void cmdline_lex_error(sub_context_ty *scp, const char *message) { error_intl(scp, message); ++number_of_errors; } void cmdline_error(const char *message) { // this function is for yacc cmdline_lex_error(0, message); } void usage(void) { fprintf(stderr, "Usage: %s ... \n", progname_get()); fprintf(stderr, " %s -Help\n", progname_get()); exit(1); } void cmdline_lex_close(void) { if (number_of_errors) usage(); }