📄 preproc.y
字号:
free(str2); free(str3); free(str4); return(res_str);}static char *make5_str(char *str1, char *str2, char *str3, char *str4, char *str5){ char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 1); strcpy(res_str, str1); strcat(res_str, str2); strcat(res_str, str3); strcat(res_str, str4); strcat(res_str, str5); free(str1); free(str2); free(str3); free(str4); free(str5); return(res_str);} static char *cat5_str(char *str1, char *str2, char *str3, char *str4, char *str5){ char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 5); strcpy(res_str, str1); strcat(res_str, " "); strcat(res_str, str2); strcat(res_str, " "); strcat(res_str, str3); strcat(res_str, " "); strcat(res_str, str4); strcat(res_str, " "); strcat(res_str, str5); free(str1); free(str2); free(str3); free(str4); free(str5); return(res_str);} static char *make_name(void){ char * name = (char *)mm_alloc(yyleng + 1); strncpy(name, yytext, yyleng); name[yyleng] = '\0'; return(name);}static voidoutput_statement(char * stmt, int mode){ int i, j=strlen(stmt); fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"", connection ? connection : "NULL"); /* do this char by char as we have to filter '\"' */ for (i = 0;i < j; i++) if (stmt[i] != '\"') fputc(stmt[i], yyout); fputs("\", ", yyout); /* dump variables to C file*/ dump_variables(argsinsert, 1); fputs("ECPGt_EOIT, ", yyout); dump_variables(argsresult, 1); fputs("ECPGt_EORT);", yyout); mode |= 2; whenever_action(mode); free(stmt); if (connection != NULL) free(connection);}static struct typedefs *get_typedef(char *name){ struct typedefs *this; for (this = types; this && strcmp(this->name, name); this = this->next); if (!this) { sprintf(errortext, "invalid datatype '%s'", name); yyerror(errortext); } return(this);}static voidadjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dimension, int type_index, bool pointer){ if (type_index >= 0) { if (*length >= 0) yyerror("No multi-dimensional array support"); *length = type_index; } if (type_dimension >= 0) { if (*dimension >= 0 && *length >= 0) yyerror("No multi-dimensional array support"); if (*dimension >= 0) *length = *dimension; *dimension = type_dimension; } if (*length >= 0 && *dimension >= 0 && pointer) yyerror("No multi-dimensional array support"); switch (type_enum) { case ECPGt_struct: case ECPGt_union: /* pointer has to get dimension 0 */ if (pointer) { *length = *dimension; *dimension = 0; } if (*length >= 0) yyerror("No multi-dimensional array support for structures"); break; case ECPGt_varchar: /* pointer has to get dimension 0 */ if (pointer) *dimension = 0; /* one index is the string length */ if (*length < 0) { *length = *dimension; *dimension = -1; } break; case ECPGt_char: case ECPGt_unsigned_char: /* pointer has to get length 0 */ if (pointer) *length=0; /* one index is the string length */ if (*length < 0) { *length = (*dimension < 0) ? 1 : *dimension; *dimension = -1; } break; default: /* a pointer has dimension = 0 */ if (pointer) { *length = *dimension; *dimension = 0; } if (*length >= 0) yyerror("No multi-dimensional array support for simple data types"); break; }}%}%union { double dval; int ival; char * str; struct when action; struct index index; int tagname; struct this_type type; enum ECPGttype type_enum;}/* special embedded SQL token */%token SQL_AT SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK %token SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE%token SQL_DEALLOCATE SQL_DISCONNECT SQL_ENUM %token SQL_FOUND SQL_FREE SQL_GO SQL_GOTO%token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_INT SQL_LONG%token SQL_OFF SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE%token SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT%token SQL_SQLWARNING SQL_START SQL_STOP SQL_STRUCT SQL_UNSIGNED%token SQL_VAR SQL_WHENEVER/* C token */%token S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_ENUM S_EXTERN%token S_FLOAT S_INT S%token S_LONG S_REGISTER S_SHORT S_SIGNED S_STATIC S_STRUCT%token S_UNION S_UNSIGNED S_VARCHAR/* I need this and don't know where it is defined inside the backend */%token TYPECAST/* Keywords (in SQL92 reserved words) */%token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC, BEGIN_TRANS, BETWEEN, BOTH, BY, CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE, COALESCE, COLLATE, COLUMN, COMMIT, CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP, ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT, FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL, GLOBAL, GRANT, GROUP, HAVING, HOUR_P, IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS, ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL, MATCH, MINUTE_P, MONTH_P, NAMES, NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC, OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC, READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK, SCROLL, SECOND_P, SELECT, SET, SUBSTRING, TABLE, TEMP, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P, UNION, UNIQUE, UPDATE, USER, USING, VALUES, VARCHAR, VARYING, VIEW, WHEN, WHERE, WITH, WORK, YEAR_P, ZONE/* Keywords (in SQL3 reserved words) */%token TRIGGER/* Keywords (in SQL92 non-reserved words) */%token COMMITTED, SERIALIZABLE, TYPE_P/* Keywords for Postgres support (not in SQL92 reserved words) * * The CREATEDB and CREATEUSER tokens should go away * when some sort of pg_privileges relation is introduced. * - Todd A. Brandys 1998-01-01? */%token ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE, BACKWARD, BEFORE, BINARY, CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE, DATABASE, DELIMITERS, DO, EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND, FORWARD, FUNCTION, HANDLER, INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, LANCOMPILER, LIMIT, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MODE, MOVE, NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL, OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL, RENAME, RESET, RETURNS, ROW, RULE, SERIAL, SEQUENCE, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION/* Special keywords, not in the query language - see the "lex" file */%token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE%token <ival> ICONST PARAM%token <dval> FCONST/* these are not real. they are here so that they get generated as #define's*/%token OP/* precedence */%left OR%left AND%right NOT%right '='%nonassoc '<' '>'%nonassoc LIKE%nonassoc BETWEEN%nonassoc IN%left Op /* multi-character ops and user-defined operators */%nonassoc NOTNULL%nonassoc ISNULL%nonassoc NULL_P%nonassoc IS%left '+' '-'%left '*' '/' '%'%left '|' /* this is the relation union op, not logical or *//* Unary Operators */%right ':'%left ';' /* end of statement or natural log */%right UMINUS%left '.'%left '[' ']'%nonassoc TYPECAST%left UNION INTERSECT EXCEPT%type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId%type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt%type <str> OptInherit key_reference key_action%type <str> key_match constraint_expr ColLabel SpecialRuleRelation%type <str> ColId default_expr ColQualifier columnDef ColQualList%type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly%type <str> OptTableElementList OptTableElement TableConstraint%type <str> ConstraintElem key_actions constraint_list ColPrimaryKey%type <str> res_target_list res_target_el res_target_list2%type <str> res_target_el2 opt_id relation_name database_name%type <str> access_method attr_name class index_name name func_name%type <str> file_name AexprConst ParamNo TypeId%type <str> in_expr_nodes not_in_expr_nodes a_expr b_expr%type <str> opt_indirection expr_list extract_list extract_arg%type <str> position_list position_expr substr_list substr_from%type <str> trim_list in_expr substr_for not_in_expr attr attrs%type <str> Typename Array Generic Numeric generic opt_float opt_numeric%type <str> opt_decimal Character character opt_varying opt_charset%type <str> opt_collate Datetime datetime opt_timezone opt_interval%type <str> numeric a_expr_or_null row_expr row_descriptor row_list%type <str> SelectStmt SubSelect result OptTemp OptTempType OptTempScope%type <str> opt_table opt_union opt_unique sort_clause sortby_list%type <str> sortby OptUseOp opt_inh_star relation_name_list name_list%type <str> group_clause having_clause from_clause c_list %type <str> table_list join_outer where_clause relation_expr row_op sub_type%type <str> opt_column_list insert_rest InsertStmt OptimizableStmt%type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt%type <str> NotifyStmt columnElem copy_dirn c_expr UnlistenStmt%type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary%type <str> opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name%type <str> ClosePortalStmt DestroyStmt VacuumStmt opt_verbose%type <str> opt_analyze opt_va_list va_list ExplainStmt index_params%type <str> index_list func_index index_elem opt_type opt_class access_method_clause%type <str> index_opt_unique IndexStmt set_opt func_return def_rest%type <str> func_args_list func_args opt_with ProcedureStmt def_arg%type <str> def_elem def_list definition def_name def_type DefineStmt%type <str> opt_instead event event_object RuleActionList,%type <str> RuleActionBlock RuleActionMulti join_list%type <str> RuleStmt opt_column opt_name oper_argtypes%type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause%type <str> RemoveAggrStmt remove_type RemoveStmt ExtendStmt%type <str> RemoveOperStmt RenameStmt all_Op user_valid_clause%type <str> VariableSetStmt var_value zone_value VariableShowStmt%type <str> VariableResetStmt AddAttrStmt alter_clause DropUserStmt%type <str> user_passwd_clause user_createdb_clause opt_trans%type <str> user_createuser_clause user_group_list user_group_clause%type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList%type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType%type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt%type <str> TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted%type <str> CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg%type <str> ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location%type <str> DestroydbStmt ClusterStmt grantee RevokeStmt encoding%type <str> GrantStmt privileges operation_commalist operation%type <str> opt_cursor opt_lmode%type <str> case_expr when_clause_list case_default case_arg when_clause%type <str> select_clause opt_select_limit select_limit_value%type <str> select_offset_value table_list using_expr join_expr%type <str> using_list from_expr table_expr join_clause join_type%type <str> join_qual update_list join_clause join_clause_with_union%type <str> opt_level opt_lock lock_type%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using%type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare%type <str> storage_clause opt_initializer vartext c_anything blockstart%type <str> blockend variable_list variable var_anything do_anything%type <str> opt_pointer cvariable ECPGDisconnect dis_name%type <str> stmt symbol opt_symbol ECPGRelease execstring server_name%type <str> connection_object opt_server opt_port c_thing opt_reference%type <str> user_name opt_user char_variable ora_user ident%type <str> db_prefix server opt_options opt_connection_name%type <str> ECPGSetConnection c_line cpp_line s_enum ECPGTypedef%type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate%type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations%type <str> sql_declaration sql_variable_list sql_variable opt_at%type <str> struct_type s_struct declaration variable_declarations%type <str> s_struct s_union union_type ECPGSetAutocommit on_off%type <type_enum> simple_type varchar_type%type <type> type ctype%type <action> action%type <index> opt_array_bounds nest_array_bounds opt_type_array_bounds%type <index> nest_type_array_bounds%type <ival> Iresult%%prog: statements;statements: /* empty */ | statements statementstatement: ecpgstart opt_at stmt ';' { connection = NULL; } | ecpgstart stmt ';' | ECPGDeclaration | c_thing { fprintf(yyout, "%s", $1); free($1); } | cpp_line { fprintf(yyout, "%s", $1); free($1); } | blockstart { fputs($1, yyout); free($1); } | blockend { fputs($1, yyout); free($1); }opt_at: SQL_AT connection_target { connection = $2; }stmt: AddAttrStmt { output_statement($1, 0); } | AlterUserStmt { output_statement($1, 0); } | ClosePortalStmt { output_statement($1, 0); } | CopyStmt { output_statement($1, 0); } | CreateStmt { output_statement($1, 0); } | CreateAsStmt { output_statement($1, 0); } | CreateSeqStmt { output_statement($1, 0); } | CreatePLangStmt { output_statement($1, 0); } | CreateTrigStmt { output_statement($1, 0); } | CreateUserStmt { output_statement($1, 0); } | ClusterStmt { output_statement($1, 0); } | DefineStmt { output_statement($1, 0); } | DestroyStmt { output_statement($1, 0); } | DropPLangStmt { output_statement($1, 0); } | DropTrigStmt { output_statement($1, 0); } | DropUserStmt { output_statement($1, 0); } | ExtendStmt { output_statement($1, 0); } | ExplainStmt { output_statement($1, 0); } | FetchStmt { output_statement($1, 1); } | GrantStmt { output_statement($1, 0); } | IndexStmt { output_statement($1, 0); } | ListenStmt { output_statement($1, 0); } | UnlistenStmt { output_statement($1, 0); } | LockStmt { output_statement($1, 0); } | ProcedureStmt { output_statement($1, 0); } | RemoveAggrStmt { output_statement($1, 0); } | RemoveOperStmt { output_statement($1, 0); } | RemoveFuncStmt { output_statement($1, 0); } | RemoveStmt { output_statement($1, 0); } | RenameStmt { output_statement($1, 0); } | RevokeStmt { output_statement($1, 0); } | OptimizableStmt { if (strncmp($1, "/* " , sizeof("/* ")-1) == 0) output_simple_statement($1); else output_statement($1, 1); } | RuleStmt { output_statement($1, 0); } | TransactionStmt { fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1); whenever_action(2); free($1); } | ViewStmt { output_statement($1, 0); } | LoadStmt { output_statement($1, 0); } | CreatedbStmt { output_statement($1, 0); } | DestroydbStmt { output_statement($1, 0); } | VacuumStmt { output_statement($1, 0); } | VariableSetStmt { output_statement($1, 0); } | VariableShowStmt { output_statement($1, 0); } | VariableResetStmt { output_statement($1, 0); } | ECPGConnect { if (connection) yyerror("no at option for connect statement.\n"); fprintf(yyout, "{ ECPGconnect(__LINE__, %s, %d);", $1, autocommit); whenever_action(2); free($1); } | ECPGCursorStmt { output_simple_statement($1); } | ECPGDeallocate { if (connection) yyerror("no at option for connect statement.\n"); fputc('{', yyout); fputs($1, yyout); whenever_action(2); free($1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -