aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/ecpg/preproc/ecpg.addons231
-rw-r--r--src/interfaces/ecpg/preproc/ecpg.header180
-rw-r--r--src/interfaces/ecpg/preproc/ecpg.trailer3560
-rw-r--r--src/interfaces/ecpg/preproc/pgc.l642
4 files changed, 2605 insertions, 2008 deletions
diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons
index e94da2a3f8d..e7dce4e404e 100644
--- a/src/interfaces/ecpg/preproc/ecpg.addons
+++ b/src/interfaces/ecpg/preproc/ecpg.addons
@@ -3,7 +3,7 @@ ECPG: stmtClosePortalStmt block
{
if (INFORMIX_MODE)
{
- if (pg_strcasecmp($1+strlen("close "), "database") == 0)
+ if (pg_strcasecmp($1 + strlen("close "), "database") == 0)
{
if (connection)
mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
@@ -22,7 +22,9 @@ ECPG: stmtDeallocateStmt block
output_deallocate_prepare_statement($1);
}
ECPG: stmtDeclareCursorStmt block
- { output_simple_statement($1, (strncmp($1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0); }
+ {
+ output_simple_statement($1, (strncmp($1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0);
+ }
ECPG: stmtDiscardStmt block
ECPG: stmtFetchStmt block
{ output_statement($1, 1, ECPGst_normal); }
@@ -44,10 +46,13 @@ ECPG: stmtExecuteStmt block
else
{
/* case of ecpg_ident or CSTRING */
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- char *str = mm_strdup($1.name + 1);
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *str = mm_strdup($1.name + 1);
- /* It must be cut off double quotation because new_variable() double-quotes. */
+ /*
+ * It must be cut off double quotation because new_variable()
+ * double-quotes.
+ */
str[strlen(str) - 1] = '\0';
sprintf(length, "%zu", strlen(str));
add_variable_to_tail(&argsinsert, new_variable(str, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
@@ -62,7 +67,8 @@ ECPG: stmtPrepareStmt block
output_prepare_statement($1.name, $1.stmt);
else if (strlen($1.type) == 0)
{
- char *stmt = cat_str(3, mm_strdup("\""), $1.stmt, mm_strdup("\""));
+ char *stmt = cat_str(3, mm_strdup("\""), $1.stmt, mm_strdup("\""));
+
output_prepare_statement($1.name, stmt);
}
else
@@ -72,10 +78,13 @@ ECPG: stmtPrepareStmt block
add_variable_to_tail(&argsinsert, find_variable($1.name), &no_indicator);
else
{
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- char *str = mm_strdup($1.name + 1);
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *str = mm_strdup($1.name + 1);
- /* It must be cut off double quotation because new_variable() double-quotes. */
+ /*
+ * It must be cut off double quotation because new_variable()
+ * double-quotes.
+ */
str[strlen(str) - 1] = '\0';
sprintf(length, "%zu", strlen(str));
add_variable_to_tail(&argsinsert, new_variable(str, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
@@ -98,7 +107,7 @@ ECPG: toplevel_stmtTransactionStmtLegacy block
ECPG: stmtViewStmt rule
| ECPGAllocateDescr
{
- fprintf(base_yyout,"ECPGallocate_desc(__LINE__, %s);",$1);
+ fprintf(base_yyout, "ECPGallocate_desc(__LINE__, %s);", $1);
whenever_action(0);
free($1);
}
@@ -118,11 +127,11 @@ ECPG: stmtViewStmt rule
}
| ECPGCursorStmt
{
- output_simple_statement($1, (strncmp($1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0);
+ output_simple_statement($1, (strncmp($1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0);
}
| ECPGDeallocateDescr
{
- fprintf(base_yyout,"ECPGdeallocate_desc(__LINE__, %s);",$1);
+ fprintf(base_yyout, "ECPGdeallocate_desc(__LINE__, %s);", $1);
whenever_action(0);
free($1);
}
@@ -152,7 +161,10 @@ ECPG: stmtViewStmt rule
whenever_action(2);
free($1);
}
- | ECPGExecuteImmediateStmt { output_statement($1, 0, ECPGst_exec_immediate); }
+ | ECPGExecuteImmediateStmt
+ {
+ output_statement($1, 0, ECPGst_exec_immediate);
+ }
| ECPGFree
{
const char *con = connection ? connection : "NULL";
@@ -160,7 +172,7 @@ ECPG: stmtViewStmt rule
if (strcmp($1, "all") == 0)
fprintf(base_yyout, "{ ECPGdeallocate_all(__LINE__, %d, %s);", compat, con);
else if ($1[0] == ':')
- fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, %s);", compat, con, $1+1);
+ fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, %s);", compat, con, $1 + 1);
else
fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, \"%s\");", compat, con, $1);
@@ -244,13 +256,14 @@ ECPG: stmtViewStmt rule
}
ECPG: where_or_current_clauseWHERECURRENT_POFcursor_name block
{
- char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
- $$ = cat_str(2,mm_strdup("where current of"), cursor_marker);
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+
+ $$ = cat_str(2, mm_strdup("where current of"), cursor_marker);
}
ECPG: CopyStmtCOPYopt_binaryqualified_nameopt_column_listcopy_fromopt_programcopy_file_namecopy_delimiteropt_withcopy_optionswhere_clause addon
- if (strcmp($6, "from") == 0 &&
- (strcmp($7, "stdin") == 0 || strcmp($7, "stdout") == 0))
- mmerror(PARSE_ERROR, ET_WARNING, "COPY FROM STDIN is not implemented");
+ if (strcmp($6, "from") == 0 &&
+ (strcmp($7, "stdin") == 0 || strcmp($7, "stdout") == 0))
+ mmerror(PARSE_ERROR, ET_WARNING, "COPY FROM STDIN is not implemented");
ECPG: var_valueNumericOnly addon
if ($1[0] == '$')
{
@@ -259,9 +272,9 @@ ECPG: var_valueNumericOnly addon
}
ECPG: fetch_argscursor_name addon
struct cursor *ptr = add_additional_variables($1, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
if ($1[0] == ':')
{
free($1);
@@ -269,9 +282,9 @@ ECPG: fetch_argscursor_name addon
}
ECPG: fetch_argsfrom_incursor_name addon
struct cursor *ptr = add_additional_variables($2, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
if ($2[0] == ':')
{
free($2);
@@ -283,9 +296,9 @@ ECPG: fetch_argsFIRST_Popt_from_incursor_name addon
ECPG: fetch_argsLAST_Popt_from_incursor_name addon
ECPG: fetch_argsALLopt_from_incursor_name addon
struct cursor *ptr = add_additional_variables($3, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
if ($3[0] == ':')
{
free($3);
@@ -293,9 +306,9 @@ ECPG: fetch_argsALLopt_from_incursor_name addon
}
ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
struct cursor *ptr = add_additional_variables($3, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
if ($3[0] == ':')
{
free($3);
@@ -309,9 +322,9 @@ ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDALLopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDALLopt_from_incursor_name addon
struct cursor *ptr = add_additional_variables($4, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
if ($4[0] == ':')
{
free($4);
@@ -322,9 +335,9 @@ ECPG: fetch_argsRELATIVE_PSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
struct cursor *ptr = add_additional_variables($4, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
if ($4[0] == ':')
{
free($4);
@@ -337,13 +350,14 @@ ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
}
ECPG: cursor_namename rule
| char_civar
- {
- char *curname = mm_alloc(strlen($1) + 2);
- sprintf(curname, ":%s", $1);
- free($1);
- $1 = curname;
- $$ = $1;
- }
+ {
+ char *curname = mm_alloc(strlen($1) + 2);
+
+ sprintf(curname, ":%s", $1);
+ free($1);
+ $1 = curname;
+ $$ = $1;
+ }
ECPG: ExplainableStmtExecuteStmt block
{
$$ = $1.name;
@@ -367,28 +381,31 @@ ECPG: ExecuteStmtEXECUTEprepared_nameexecute_param_clauseexecute_rest block
}
ECPG: ExecuteStmtCREATEOptTempTABLEcreate_as_targetASEXECUTEprepared_nameexecute_param_clauseopt_with_dataexecute_rest block
{
- $$.name = cat_str(8,mm_strdup("create"),$2,mm_strdup("table"),$4,mm_strdup("as execute"),$7,$8,$9);
+ $$.name = cat_str(8, mm_strdup("create"), $2, mm_strdup("table"), $4, mm_strdup("as execute"), $7, $8, $9);
}
ECPG: ExecuteStmtCREATEOptTempTABLEIF_PNOTEXISTScreate_as_targetASEXECUTEprepared_nameexecute_param_clauseopt_with_dataexecute_rest block
{
- $$.name = cat_str(8,mm_strdup("create"),$2,mm_strdup("table if not exists"),$7,mm_strdup("as execute"),$10,$11,$12);
+ $$.name = cat_str(8, mm_strdup("create"), $2, mm_strdup("table if not exists"), $7, mm_strdup("as execute"), $10, $11, $12);
}
ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectStmt block
{
- struct cursor *ptr, *this;
- char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : mm_strdup($2);
- char *comment, *c1, *c2;
- int (* strcmp_fn)(const char *, const char *) = (($2[0] == ':' || $2[0] == '"') ? strcmp : pg_strcasecmp);
+ struct cursor *ptr,
+ *this;
+ char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : mm_strdup($2);
+ char *comment,
+ *c1,
+ *c2;
+ int (*strcmp_fn) (const char *, const char *) = (($2[0] == ':' || $2[0] == '"') ? strcmp : pg_strcasecmp);
- if (INFORMIX_MODE && pg_strcasecmp($2, "database") == 0)
- mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
+ if (INFORMIX_MODE && pg_strcasecmp($2, "database") == 0)
+ mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
for (ptr = cur; ptr != NULL; ptr = ptr->next)
{
if (strcmp_fn($2, ptr->name) == 0)
{
if ($2[0] == ':')
- mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", $2+1);
+ mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", $2 + 1);
else
mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", $2);
}
@@ -401,7 +418,7 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
this->function = (current_function ? mm_strdup(current_function) : NULL);
this->connection = connection ? mm_strdup(connection) : NULL;
this->opened = false;
- this->command = cat_str(7, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for"), $7);
+ this->command = cat_str(7, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for"), $7);
this->argsinsert = argsinsert;
this->argsinsert_oos = NULL;
this->argsresult = argsresult;
@@ -422,15 +439,15 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
ECPG: ClosePortalStmtCLOSEcursor_name block
{
- char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
+ char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
struct cursor *ptr = NULL;
- for (ptr = cur; ptr != NULL; ptr = ptr -> next)
+
+ for (ptr = cur; ptr != NULL; ptr = ptr->next)
{
- if (strcmp($2, ptr -> name) == 0)
+ if (strcmp($2, ptr->name) == 0)
{
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
-
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
break;
}
}
@@ -444,15 +461,22 @@ ECPG: opt_hold block
$$ = EMPTY;
}
ECPG: into_clauseINTOOptTempTableName block
- {
- FoundInto = 1;
- $$= cat2_str(mm_strdup("into"), $2);
- }
- | ecpg_into { $$ = EMPTY; }
+ {
+ FoundInto = 1;
+ $$ = cat2_str(mm_strdup("into"), $2);
+ }
+ | ecpg_into
+ {
+ $$ = EMPTY;
+ }
ECPG: TypenameSimpleTypenameopt_array_bounds block
- { $$ = cat2_str($1, $2.str); }
+ {
+ $$ = cat2_str($1, $2.str);
+ }
ECPG: TypenameSETOFSimpleTypenameopt_array_bounds block
- { $$ = cat_str(3, mm_strdup("setof"), $2, $3.str); }
+ {
+ $$ = cat_str(3, mm_strdup("setof"), $2, $3.str);
+ }
ECPG: opt_array_boundsopt_array_bounds'['']' block
{
$$.index1 = $1.index1;
@@ -477,22 +501,24 @@ ECPG: opt_array_bounds
{
$$.index1 = mm_strdup("-1");
$$.index2 = mm_strdup("-1");
- $$.str= EMPTY;
+ $$.str = EMPTY;
}
ECPG: IconstICONST block
- { $$ = make_name(); }
+ {
+ $$ = make_name();
+ }
ECPG: AexprConstNULL_P rule
- | civar { $$ = $1; }
- | civarind { $$ = $1; }
+ | civar { $$ = $1; }
+ | civarind { $$ = $1; }
ECPG: ColIdcol_name_keyword rule
- | ECPGKeywords { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
- | CHAR_P { $$ = mm_strdup("char"); }
- | VALUES { $$ = mm_strdup("values"); }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | VALUES { $$ = mm_strdup("values"); }
ECPG: type_function_nametype_func_name_keyword rule
- | ECPGKeywords { $$ = $1; }
- | ECPGTypeName { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGTypeName { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
ECPG: VariableShowStmtSHOWALL block
{
mmerror(PARSE_ERROR, ET_ERROR, "SHOW ALL is not implemented");
@@ -505,73 +531,81 @@ ECPG: FetchStmtMOVEfetch_args rule
}
| FETCH FORWARD cursor_name opt_ecpg_fetch_into
{
- char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
struct cursor *ptr = add_additional_variables($3, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
}
| FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
{
- char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
struct cursor *ptr = add_additional_variables($4, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
}
| FETCH BACKWARD cursor_name opt_ecpg_fetch_into
{
- char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
struct cursor *ptr = add_additional_variables($3, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
}
| FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
{
- char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
struct cursor *ptr = add_additional_variables($4, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
}
| MOVE FORWARD cursor_name
{
- char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
struct cursor *ptr = add_additional_variables($3, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
}
| MOVE FORWARD from_in cursor_name
{
- char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
struct cursor *ptr = add_additional_variables($4, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
}
| MOVE BACKWARD cursor_name
{
- char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
struct cursor *ptr = add_additional_variables($3, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
}
| MOVE BACKWARD from_in cursor_name
{
- char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
struct cursor *ptr = add_additional_variables($4, false);
- if (ptr -> connection)
- connection = mm_strdup(ptr -> connection);
+
+ if (ptr->connection)
+ connection = mm_strdup(ptr->connection);
$$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
}
@@ -581,4 +615,7 @@ ECPG: limit_clauseLIMITselect_limit_value','select_offset_value block
$$ = cat_str(4, mm_strdup("limit"), $2, mm_strdup(","), $4);
}
ECPG: SignedIconstIconst rule
- | civar { $$ = $1; }
+ | civar
+ {
+ $$ = $1;
+ }
diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header
index 3790a601d1a..28e1b2aac40 100644
--- a/src/interfaces/ecpg/preproc/ecpg.header
+++ b/src/interfaces/ecpg/preproc/ecpg.header
@@ -37,24 +37,25 @@ extern int base_yynerrs;
/*
* Variables containing simple states.
*/
-int struct_level = 0;
-int braces_open; /* brace level counter */
-char *current_function;
-int ecpg_internal_var = 0;
-char *connection = NULL;
-char *input_filename = NULL;
+int struct_level = 0;
+int braces_open; /* brace level counter */
+char *current_function;
+int ecpg_internal_var = 0;
+char *connection = NULL;
+char *input_filename = NULL;
static int FoundInto = 0;
static int initializer = 0;
static int pacounter = 1;
-static char pacounter_buffer[sizeof(int) * CHAR_BIT * 10 / 3]; /* a rough guess at the size we need */
+static char pacounter_buffer[sizeof(int) * CHAR_BIT * 10 / 3]; /* a rough guess at the
+ * size we need */
static struct this_type actual_type[STRUCT_DEPTH];
static char *actual_startline[STRUCT_DEPTH];
static int varchar_counter = 1;
static int bytea_counter = 1;
/* temporarily store struct members while creating the data structure */
-struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
+struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = {NULL};
/* also store struct type so we can do a sizeof() later */
static char *ECPGstruct_sizeof = NULL;
@@ -82,7 +83,7 @@ vmmerror(int error_code, enum errortype type, const char *error, va_list ap)
fprintf(stderr, "%s:%d: ", input_filename, base_yylineno);
- switch(type)
+ switch (type)
{
case ET_WARNING:
fprintf(stderr, _("WARNING: "));
@@ -96,7 +97,7 @@ vmmerror(int error_code, enum errortype type, const char *error, va_list ap)
fprintf(stderr, "\n");
- switch(type)
+ switch (type)
{
case ET_WARNING:
break;
@@ -107,7 +108,7 @@ vmmerror(int error_code, enum errortype type, const char *error, va_list ap)
}
void
-mmerror(int error_code, enum errortype type, const char *error, ...)
+mmerror(int error_code, enum errortype type, const char *error,...)
{
va_list ap;
@@ -117,7 +118,7 @@ mmerror(int error_code, enum errortype type, const char *error, ...)
}
void
-mmfatal(int error_code, const char *error, ...)
+mmfatal(int error_code, const char *error,...)
{
va_list ap;
@@ -142,7 +143,7 @@ mmfatal(int error_code, const char *error, ...)
static char *
cat2_str(char *str1, char *str2)
{
- char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2);
+ char *res_str = (char *) mm_alloc(strlen(str1) + strlen(str2) + 2);
strcpy(res_str, str1);
if (strlen(str1) != 0 && strlen(str2) != 0)
@@ -154,11 +155,11 @@ cat2_str(char *str1, char *str2)
}
static char *
-cat_str(int count, ...)
+cat_str(int count,...)
{
va_list args;
int i;
- char *res_str;
+ char *res_str;
va_start(args, count);
@@ -176,7 +177,7 @@ cat_str(int count, ...)
static char *
make2_str(char *str1, char *str2)
{
- char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 1);
+ char *res_str = (char *) mm_alloc(strlen(str1) + strlen(str2) + 1);
strcpy(res_str, str1);
strcat(res_str, str2);
@@ -188,7 +189,7 @@ make2_str(char *str1, char *str2)
static char *
make3_str(char *str1, char *str2, char *str3)
{
- char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) +strlen(str3) + 1);
+ char *res_str = (char *) mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 1);
strcpy(res_str, str1);
strcat(res_str, str2);
@@ -210,13 +211,18 @@ static char *
create_questionmarks(char *name, bool array)
{
struct variable *p = find_variable(name);
- int count;
- char *result = EMPTY;
+ int count;
+ char *result = EMPTY;
- /* In case we have a struct, we have to print as many "?" as there are attributes in the struct
+ /*
+ * In case we have a struct, we have to print as many "?" as there are
+ * attributes in the struct
+ *
* An array is only allowed together with an element argument
- * This is essentially only used for inserts, but using a struct as input parameter is an error anywhere else
- * so we don't have to worry here. */
+ *
+ * This is essentially only used for inserts, but using a struct as input
+ * parameter is an error anywhere else so we don't have to worry here.
+ */
if (p->type->type == ECPGt_struct || (array && p->type->type == ECPGt_array && p->type->u.element->type == ECPGt_struct))
{
@@ -227,12 +233,12 @@ create_questionmarks(char *name, bool array)
else
m = p->type->u.element->u.members;
- for (count = 0; m != NULL; m=m->next, count++);
+ for (count = 0; m != NULL; m = m->next, count++);
}
else
count = 1;
- for (; count > 0; count --)
+ for (; count > 0; count--)
{
sprintf(pacounter_buffer, "$%d", pacounter++);
result = cat_str(3, result, mm_strdup(pacounter_buffer), mm_strdup(" , "));
@@ -240,42 +246,45 @@ create_questionmarks(char *name, bool array)
/* removed the trailing " ," */
- result[strlen(result)-3] = '\0';
+ result[strlen(result) - 3] = '\0';
return result;
}
static char *
adjust_outofscope_cursor_vars(struct cursor *cur)
{
- /* Informix accepts DECLARE with variables that are out of scope when OPEN is called.
- * For instance you can DECLARE a cursor in one function, and OPEN/FETCH/CLOSE
- * it in another functions. This is very useful for e.g. event-driver programming,
- * but may also lead to dangerous programming. The limitation when this is allowed
- * and doesn't cause problems have to be documented, like the allocated variables
- * must not be realloc()'ed.
+ /*
+ * Informix accepts DECLARE with variables that are out of scope when OPEN
+ * is called. For instance you can DECLARE a cursor in one function, and
+ * OPEN/FETCH/CLOSE it in another functions. This is very useful for e.g.
+ * event-driver programming, but may also lead to dangerous programming.
+ * The limitation when this is allowed and doesn't cause problems have to
+ * be documented, like the allocated variables must not be realloc()'ed.
*
- * We have to change the variables to our own struct and just store the pointer
- * instead of the variable. Do it only for local variables, not for globals.
+ * We have to change the variables to our own struct and just store the
+ * pointer instead of the variable. Do it only for local variables, not
+ * for globals.
*/
- char *result = EMPTY;
- int insert;
+ char *result = EMPTY;
+ int insert;
for (insert = 1; insert >= 0; insert--)
{
struct arguments *list;
struct arguments *ptr;
struct arguments *newlist = NULL;
- struct variable *newvar, *newind;
+ struct variable *newvar,
+ *newind;
list = (insert ? cur->argsinsert : cur->argsresult);
for (ptr = list; ptr != NULL; ptr = ptr->next)
{
- char var_text[20];
- char *original_var;
- bool skip_set_var = false;
- bool var_ptr = false;
+ char var_text[20];
+ char *original_var;
+ bool skip_set_var = false;
+ bool var_ptr = false;
/* change variable name to "ECPGget_var(<counter>)" */
original_var = ptr->variable->name;
@@ -350,10 +359,10 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
|| ptr->variable->type->u.element->type == ECPGt_union)
{
newvar = new_variable(cat_str(5, mm_strdup("(*("),
- mm_strdup(ptr->variable->type->u.element->type_name),
- mm_strdup(" *)(ECPGget_var("),
- mm_strdup(var_text),
- mm_strdup(")")),
+ mm_strdup(ptr->variable->type->u.element->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
ECPGmake_struct_type(ptr->variable->type->u.element->u.members,
ptr->variable->type->u.element->type,
ptr->variable->type->u.element->type_name,
@@ -387,7 +396,10 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
var_ptr = true;
}
- /* create call to "ECPGset_var(<counter>, <connection>, <pointer>. <line number>)" */
+ /*
+ * create call to "ECPGset_var(<counter>, <connection>, <pointer>.
+ * <line number>)"
+ */
if (!skip_set_var)
{
sprintf(var_text, "%d, %s", ecpg_internal_var++, var_ptr ? "&(" : "(");
@@ -396,7 +408,10 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
mm_strdup("), __LINE__);\n"));
}
- /* now the indicator if there is one and it's not a global variable */
+ /*
+ * now the indicator if there is one and it's not a global
+ * variable
+ */
if ((ptr->indicator->type->type == ECPGt_NO_INDICATOR) || (ptr->indicator->brace_level == 0))
{
newind = ptr->indicator;
@@ -412,10 +427,10 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
|| ptr->indicator->type->type == ECPGt_union)
{
newind = new_variable(cat_str(5, mm_strdup("(*("),
- mm_strdup(ptr->indicator->type->type_name),
- mm_strdup(" *)(ECPGget_var("),
- mm_strdup(var_text),
- mm_strdup(")")),
+ mm_strdup(ptr->indicator->type->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
ECPGmake_struct_type(ptr->indicator->type->u.members,
ptr->indicator->type->type,
ptr->indicator->type->type_name,
@@ -429,10 +444,10 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
|| ptr->indicator->type->u.element->type == ECPGt_union)
{
newind = new_variable(cat_str(5, mm_strdup("(*("),
- mm_strdup(ptr->indicator->type->u.element->type_name),
- mm_strdup(" *)(ECPGget_var("),
- mm_strdup(var_text),
- mm_strdup(")")),
+ mm_strdup(ptr->indicator->type->u.element->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
ECPGmake_struct_type(ptr->indicator->type->u.element->u.members,
ptr->indicator->type->u.element->type,
ptr->indicator->type->u.element->type_name,
@@ -476,7 +491,10 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
var_ptr = true;
}
- /* create call to "ECPGset_var(<counter>, <pointer>. <line number>)" */
+ /*
+ * create call to "ECPGset_var(<counter>, <pointer>. <line
+ * number>)"
+ */
sprintf(var_text, "%d, %s", ecpg_internal_var++, var_ptr ? "&(" : "(");
result = cat_str(5, result, mm_strdup("ECPGset_var("),
mm_strdup(var_text), mm_strdup(original_var),
@@ -505,9 +523,9 @@ add_additional_variables(char *name, bool insert)
{
struct cursor *ptr;
struct arguments *p;
- int (* strcmp_fn)(const char *, const char *) = ((name[0] == ':' || name[0] == '"') ? strcmp : pg_strcasecmp);
+ int (*strcmp_fn) (const char *, const char *) = ((name[0] == ':' || name[0] == '"') ? strcmp : pg_strcasecmp);
- for (ptr = cur; ptr != NULL; ptr=ptr->next)
+ for (ptr = cur; ptr != NULL; ptr = ptr->next)
{
if (strcmp_fn(ptr->name, name) == 0)
break;
@@ -521,8 +539,12 @@ add_additional_variables(char *name, bool insert)
if (insert)
{
- /* add all those input variables that were given earlier
- * note that we have to append here but have to keep the existing order */
+ /*
+ * add all those input variables that were given earlier
+ *
+ * note that we have to append here but have to keep the existing
+ * order
+ */
for (p = (SAMEFUNC(ptr) ? ptr->argsinsert : ptr->argsinsert_oos); p; p = p->next)
add_variable_to_tail(&argsinsert, p->variable, p->indicator);
}
@@ -539,7 +561,8 @@ add_typedef(char *name, char *dimension, char *length, enum ECPGttype type_enum,
char *type_dimension, char *type_index, int initializer, int array)
{
/* add entry to list */
- struct typedefs *ptr, *this;
+ struct typedefs *ptr,
+ *this;
if ((type_enum == ECPGt_struct ||
type_enum == ECPGt_union) &&
@@ -570,7 +593,7 @@ add_typedef(char *name, char *dimension, char *length, enum ECPGttype type_enum,
this->type->type_index = length; /* length of string */
this->type->type_sizeof = ECPGstruct_sizeof;
this->struct_member_list = (type_enum == ECPGt_struct || type_enum == ECPGt_union) ?
- ECPGstruct_member_dup(struct_member_list[struct_level]) : NULL;
+ ECPGstruct_member_dup(struct_member_list[struct_level]) : NULL;
if (type_enum != ECPGt_varchar &&
type_enum != ECPGt_bytea &&
@@ -593,15 +616,16 @@ static bool
check_declared_list(const char *name)
{
struct declared_list *ptr = NULL;
- for (ptr = g_declared_list; ptr != NULL; ptr = ptr -> next)
+
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
{
if (!ptr->connection)
continue;
- if (strcmp(name, ptr -> name) == 0)
+ if (strcmp(name, ptr->name) == 0)
{
if (connection && strcmp(ptr->connection, connection) != 0)
mmerror(PARSE_ERROR, ET_WARNING, "connection %s is overwritten with %s by DECLARE statement %s", connection, ptr->connection, name);
- connection = mm_strdup(ptr -> connection);
+ connection = mm_strdup(ptr->connection);
return true;
}
}
@@ -614,18 +638,18 @@ check_declared_list(const char *name)
%locations
%union {
- double dval;
- char *str;
- int ival;
- struct when action;
- struct index index;
- int tagname;
- struct this_type type;
- enum ECPGttype type_enum;
- enum ECPGdtype dtype_enum;
- struct fetch_desc descriptor;
- struct su_symbol struct_union;
- struct prep prep;
- struct exec exec;
- struct describe describe;
+ double dval;
+ char *str;
+ int ival;
+ struct when action;
+ struct index index;
+ int tagname;
+ struct this_type type;
+ enum ECPGttype type_enum;
+ enum ECPGdtype dtype_enum;
+ struct fetch_desc descriptor;
+ struct su_symbol struct_union;
+ struct prep prep;
+ struct exec exec;
+ struct describe describe;
}
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index b2aa44f36dd..b6233e5e530 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -1,465 +1,610 @@
/* src/interfaces/ecpg/preproc/ecpg.trailer */
-statements: /*EMPTY*/
- | statements statement
- ;
+statements: /* EMPTY */
+ | statements statement
+ ;
statement: ecpgstart at toplevel_stmt ';'
- {
- if (connection)
- free(connection);
- connection = NULL;
- }
- | ecpgstart toplevel_stmt ';'
- {
- if (connection)
- free(connection);
- connection = NULL;
- }
- | ecpgstart ECPGVarDeclaration
- {
- fprintf(base_yyout, "%s", $2);
- free($2);
- output_line_number();
- }
- | ECPGDeclaration
- | c_thing { fprintf(base_yyout, "%s", $1); free($1); }
- | CPP_LINE { fprintf(base_yyout, "%s", $1); free($1); }
- | '{' { braces_open++; fputs("{", base_yyout); }
- | '}'
+ {
+ if (connection)
+ free(connection);
+ connection = NULL;
+ }
+ | ecpgstart toplevel_stmt ';'
+ {
+ if (connection)
+ free(connection);
+ connection = NULL;
+ }
+ | ecpgstart ECPGVarDeclaration
+ {
+ fprintf(base_yyout, "%s", $2);
+ free($2);
+ output_line_number();
+ }
+ | ECPGDeclaration
+ | c_thing
+ {
+ fprintf(base_yyout, "%s", $1);
+ free($1);
+ }
+ | CPP_LINE
+ {
+ fprintf(base_yyout, "%s", $1);
+ free($1);
+ }
+ | '{'
+ {
+ braces_open++;
+ fputs("{", base_yyout);
+ }
+ | '}'
+ {
+ remove_typedefs(braces_open);
+ remove_variables(braces_open--);
+ if (braces_open == 0)
{
- remove_typedefs(braces_open);
- remove_variables(braces_open--);
- if (braces_open == 0)
- {
- free(current_function);
- current_function = NULL;
- }
- fputs("}", base_yyout);
+ free(current_function);
+ current_function = NULL;
}
- ;
+ fputs("}", base_yyout);
+ }
+ ;
-CreateAsStmt: CREATE OptTemp TABLE create_as_target AS {FoundInto = 0;} SelectStmt opt_with_data
- {
- if (FoundInto == 1)
- mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
+CreateAsStmt: CREATE OptTemp TABLE create_as_target AS
+ {
+ FoundInto = 0;
+ } SelectStmt opt_with_data
+ {
+ if (FoundInto == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
- $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table"), $4, mm_strdup("as"), $7, $8);
- }
- | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS {FoundInto = 0;} SelectStmt opt_with_data
- {
- if (FoundInto == 1)
- mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
+ $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table"), $4, mm_strdup("as"), $7, $8);
+ }
+ | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS
+ {
+ FoundInto = 0;
+ } SelectStmt opt_with_data
+ {
+ if (FoundInto == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
- $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table if not exists"), $7, mm_strdup("as"), $10, $11);
- }
- ;
+ $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table if not exists"), $7, mm_strdup("as"), $10, $11);
+ }
+ ;
at: AT connection_object
- {
- connection = $2;
- /*
- * Do we have a variable as connection target? Remove the variable
- * from the variable list or else it will be used twice.
- */
- if (argsinsert != NULL)
- argsinsert = NULL;
- }
- ;
+ {
+ connection = $2;
+
+ /*
+ * Do we have a variable as connection target? Remove the variable
+ * from the variable list or else it will be used twice.
+ */
+ if (argsinsert != NULL)
+ argsinsert = NULL;
+ }
+ ;
/*
* the exec sql connect statement: connect to the given database
*/
ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
- { $$ = cat_str(5, $3, mm_strdup(","), $5, mm_strdup(","), $4); }
- | SQL_CONNECT TO DEFAULT
- { $$ = mm_strdup("NULL, NULL, NULL, \"DEFAULT\""); }
- /* also allow ORACLE syntax */
- | SQL_CONNECT ora_user
- { $$ = cat_str(3, mm_strdup("NULL,"), $2, mm_strdup(", NULL")); }
- | DATABASE connection_target
- { $$ = cat2_str($2, mm_strdup(", NULL, NULL, NULL")); }
- ;
+ {
+ $$ = cat_str(5, $3, mm_strdup(","), $5, mm_strdup(","), $4);
+ }
+ | SQL_CONNECT TO DEFAULT
+ {
+ $$ = mm_strdup("NULL, NULL, NULL, \"DEFAULT\"");
+ }
+ /* also allow ORACLE syntax */
+ | SQL_CONNECT ora_user
+ {
+ $$ = cat_str(3, mm_strdup("NULL,"), $2, mm_strdup(", NULL"));
+ }
+ | DATABASE connection_target
+ {
+ $$ = cat2_str($2, mm_strdup(", NULL, NULL, NULL"));
+ }
+ ;
connection_target: opt_database_name opt_server opt_port
- {
- /* old style: dbname[@server][:port] */
- if (strlen($2) > 0 && *($2) != '@')
- mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\", found \"%s\"", $2);
+ {
+ /* old style: dbname[@server][:port] */
+ if (strlen($2) > 0 && *($2) != '@')
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\", found \"%s\"", $2);
- /* C strings need to be handled differently */
- if ($1[0] == '\"')
- $$ = $1;
- else
- $$ = make3_str(mm_strdup("\""), make3_str($1, $2, $3), mm_strdup("\""));
- }
- | db_prefix ':' server opt_port '/' opt_database_name opt_options
- {
- /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
- if (strncmp($1, "unix:postgresql", strlen("unix:postgresql")) != 0 && strncmp($1, "tcp:postgresql", strlen("tcp:postgresql")) != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported");
+ /* C strings need to be handled differently */
+ if ($1[0] == '\"')
+ $$ = $1;
+ else
+ $$ = make3_str(mm_strdup("\""), make3_str($1, $2, $3), mm_strdup("\""));
+ }
+ | db_prefix ':' server opt_port '/' opt_database_name opt_options
+ {
+ /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
+ if (strncmp($1, "unix:postgresql", strlen("unix:postgresql")) != 0 && strncmp($1, "tcp:postgresql", strlen("tcp:postgresql")) != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported");
- if (strncmp($3, "//", strlen("//")) != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "expected \"://\", found \"%s\"", $3);
+ if (strncmp($3, "//", strlen("//")) != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"://\", found \"%s\"", $3);
- if (strncmp($1, "unix", strlen("unix")) == 0 &&
- strncmp($3 + strlen("//"), "localhost", strlen("localhost")) != 0 &&
- strncmp($3 + strlen("//"), "127.0.0.1", strlen("127.0.0.1")) != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "Unix-domain sockets only work on \"localhost\" but not on \"%s\"", $3 + strlen("//"));
+ if (strncmp($1, "unix", strlen("unix")) == 0 &&
+ strncmp($3 + strlen("//"), "localhost", strlen("localhost")) != 0 &&
+ strncmp($3 + strlen("//"), "127.0.0.1", strlen("127.0.0.1")) != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "Unix-domain sockets only work on \"localhost\" but not on \"%s\"", $3 + strlen("//"));
- $$ = make3_str(make3_str(mm_strdup("\""), $1, mm_strdup(":")), $3, make3_str(make3_str($4, mm_strdup("/"), $6), $7, mm_strdup("\"")));
- }
- | char_variable
- {
- $$ = $1;
- }
- | ecpg_sconst
- {
- /* We can only process double quoted strings not single quotes ones,
- * so we change the quotes.
- * Note, that the rule for ecpg_sconst adds these single quotes. */
- $1[0] = '\"';
- $1[strlen($1)-1] = '\"';
- $$ = $1;
- }
- ;
+ $$ = make3_str(make3_str(mm_strdup("\""), $1, mm_strdup(":")), $3, make3_str(make3_str($4, mm_strdup("/"), $6), $7, mm_strdup("\"")));
+ }
+ | char_variable
+ {
+ $$ = $1;
+ }
+ | ecpg_sconst
+ {
+ /*
+ * We can only process double quoted strings not single quotes ones,
+ * so we change the quotes. Note, that the rule for ecpg_sconst adds
+ * these single quotes.
+ */
+ $1[0] = '\"';
+ $1[strlen($1) - 1] = '\"';
+ $$ = $1;
+ }
+ ;
-opt_database_name: name { $$ = $1; }
- | /*EMPTY*/ { $$ = EMPTY; }
- ;
+opt_database_name: name
+ {
+ $$ = $1;
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
db_prefix: ecpg_ident cvariable
- {
- if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "expected \"postgresql\", found \"%s\"", $2);
+ {
+ if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"postgresql\", found \"%s\"", $2);
- if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "invalid connection type: %s", $1);
+ if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "invalid connection type: %s", $1);
- $$ = make3_str($1, mm_strdup(":"), $2);
- }
- ;
+ $$ = make3_str($1, mm_strdup(":"), $2);
+ }
+ ;
server: Op server_name
- {
- if (strcmp($1, "@") != 0 && strcmp($1, "//") != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\" or \"://\", found \"%s\"", $1);
+ {
+ if (strcmp($1, "@") != 0 && strcmp($1, "//") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\" or \"://\", found \"%s\"", $1);
- $$ = make2_str($1, $2);
- }
- ;
+ $$ = make2_str($1, $2);
+ }
+ ;
-opt_server: server { $$ = $1; }
- | /*EMPTY*/ { $$ = EMPTY; }
- ;
+opt_server: server
+ {
+ $$ = $1;
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
-server_name: ColId { $$ = $1; }
- | ColId '.' server_name { $$ = make3_str($1, mm_strdup("."), $3); }
- | IP { $$ = make_name(); }
- ;
+server_name: ColId
+ {
+ $$ = $1;
+ }
+ | ColId '.' server_name
+ {
+ $$ = make3_str($1, mm_strdup("."), $3);
+ }
+ | IP
+ {
+ $$ = make_name();
+ }
+ ;
-opt_port: ':' Iconst { $$ = make2_str(mm_strdup(":"), $2); }
- | /*EMPTY*/ { $$ = EMPTY; }
- ;
+opt_port: ':' Iconst
+ {
+ $$ = make2_str(mm_strdup(":"), $2);
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
-opt_connection_name: AS connection_object { $$ = $2; }
- | /*EMPTY*/ { $$ = mm_strdup("NULL"); }
- ;
+opt_connection_name: AS connection_object
+ {
+ $$ = $2;
+ }
+ | /* EMPTY */
+ {
+ $$ = mm_strdup("NULL");
+ }
+ ;
-opt_user: USER ora_user { $$ = $2; }
- | /*EMPTY*/ { $$ = mm_strdup("NULL, NULL"); }
- ;
+opt_user: USER ora_user
+ {
+ $$ = $2;
+ }
+ | /* EMPTY */
+ {
+ $$ = mm_strdup("NULL, NULL");
+ }
+ ;
ora_user: user_name
- { $$ = cat2_str($1, mm_strdup(", NULL")); }
- | user_name '/' user_name
- { $$ = cat_str(3, $1, mm_strdup(","), $3); }
- | user_name SQL_IDENTIFIED BY user_name
- { $$ = cat_str(3, $1, mm_strdup(","), $4); }
- | user_name USING user_name
- { $$ = cat_str(3, $1, mm_strdup(","), $3); }
- ;
+ {
+ $$ = cat2_str($1, mm_strdup(", NULL"));
+ }
+ | user_name '/' user_name
+ {
+ $$ = cat_str(3, $1, mm_strdup(","), $3);
+ }
+ | user_name SQL_IDENTIFIED BY user_name
+ {
+ $$ = cat_str(3, $1, mm_strdup(","), $4);
+ }
+ | user_name USING user_name
+ {
+ $$ = cat_str(3, $1, mm_strdup(","), $3);
+ }
+ ;
user_name: RoleId
- {
- if ($1[0] == '\"')
- $$ = $1;
- else
- $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
- }
- | ecpg_sconst
- {
- if ($1[0] == '\"')
- $$ = $1;
- else
- $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
- }
- | civar
- {
- enum ECPGttype type = argsinsert->variable->type->type;
+ {
+ if ($1[0] == '\"')
+ $$ = $1;
+ else
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ | ecpg_sconst
+ {
+ if ($1[0] == '\"')
+ $$ = $1;
+ else
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ | civar
+ {
+ enum ECPGttype type = argsinsert->variable->type->type;
- /* if array see what's inside */
- if (type == ECPGt_array)
- type = argsinsert->variable->type->u.element->type;
+ /* if array see what's inside */
+ if (type == ECPGt_array)
+ type = argsinsert->variable->type->u.element->type;
- /* handle varchars */
- if (type == ECPGt_varchar)
- $$ = make2_str(mm_strdup(argsinsert->variable->name), mm_strdup(".arr"));
- else
- $$ = mm_strdup(argsinsert->variable->name);
- }
- ;
+ /* handle varchars */
+ if (type == ECPGt_varchar)
+ $$ = make2_str(mm_strdup(argsinsert->variable->name), mm_strdup(".arr"));
+ else
+ $$ = mm_strdup(argsinsert->variable->name);
+ }
+ ;
char_variable: cvariable
+ {
+ /* check if we have a string variable */
+ struct variable *p = find_variable($1);
+ enum ECPGttype type = p->type->type;
+
+ /* If we have just one character this is not a string */
+ if (atol(p->type->size) == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
+ else
{
- /* check if we have a string variable */
- struct variable *p = find_variable($1);
- enum ECPGttype type = p->type->type;
+ /* if array see what's inside */
+ if (type == ECPGt_array)
+ type = p->type->u.element->type;
- /* If we have just one character this is not a string */
- if (atol(p->type->size) == 1)
- mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
- else
+ switch (type)
{
- /* if array see what's inside */
- if (type == ECPGt_array)
- type = p->type->u.element->type;
-
- switch (type)
- {
- case ECPGt_char:
- case ECPGt_unsigned_char:
- case ECPGt_string:
- $$ = $1;
- break;
- case ECPGt_varchar:
- $$ = make2_str($1, mm_strdup(".arr"));
- break;
- default:
- mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
- $$ = $1;
- break;
- }
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ case ECPGt_string:
+ $$ = $1;
+ break;
+ case ECPGt_varchar:
+ $$ = make2_str($1, mm_strdup(".arr"));
+ break;
+ default:
+ mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
+ $$ = $1;
+ break;
}
}
- ;
+ }
+ ;
opt_options: Op connect_options
- {
- if (strlen($1) == 0)
- mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
+ {
+ if (strlen($1) == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
- if (strcmp($1, "?") != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", $1);
+ if (strcmp($1, "?") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", $1);
- $$ = make2_str(mm_strdup("?"), $2);
- }
- | /*EMPTY*/ { $$ = EMPTY; }
- ;
+ $$ = make2_str(mm_strdup("?"), $2);
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
-connect_options: ColId opt_opt_value
- {
- $$ = make2_str($1, $2);
- }
- | ColId opt_opt_value Op connect_options
- {
- if (strlen($3) == 0)
- mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
+connect_options: ColId opt_opt_value
+ {
+ $$ = make2_str($1, $2);
+ }
+ | ColId opt_opt_value Op connect_options
+ {
+ if (strlen($3) == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
- if (strcmp($3, "&") != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", $3);
+ if (strcmp($3, "&") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", $3);
- $$ = cat_str(3, make2_str($1, $2), $3, $4);
- }
- ;
-
-opt_opt_value: /*EMPTY*/
- { $$ = EMPTY; }
- | '=' Iconst
- { $$ = make2_str(mm_strdup("="), $2); }
- | '=' ecpg_ident
- { $$ = make2_str(mm_strdup("="), $2); }
- | '=' civar
- { $$ = make2_str(mm_strdup("="), $2); }
- ;
+ $$ = cat_str(3, make2_str($1, $2), $3, $4);
+ }
+ ;
+
+opt_opt_value: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | '=' Iconst
+ {
+ $$ = make2_str(mm_strdup("="), $2);
+ }
+ | '=' ecpg_ident
+ {
+ $$ = make2_str(mm_strdup("="), $2);
+ }
+ | '=' civar
+ {
+ $$ = make2_str(mm_strdup("="), $2);
+ }
+ ;
prepared_name: name
+ {
+ if ($1[0] == '\"' && $1[strlen($1) - 1] == '\"') /* already quoted? */
+ $$ = $1;
+ else /* not quoted => convert to lowercase */
{
- if ($1[0] == '\"' && $1[strlen($1)-1] == '\"') /* already quoted? */
- $$ = $1;
- else /* not quoted => convert to lowercase */
- {
- size_t i;
+ size_t i;
- for (i = 0; i< strlen($1); i++)
- $1[i] = tolower((unsigned char) $1[i]);
+ for (i = 0; i < strlen($1); i++)
+ $1[i] = tolower((unsigned char) $1[i]);
- $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
- }
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
}
- | char_variable { $$ = $1; }
- ;
+ }
+ | char_variable
+ {
+ $$ = $1;
+ }
+ ;
/*
* Declare Statement
*/
ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_list *ptr = NULL;
+
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
{
- struct declared_list *ptr = NULL;
- /* Check whether the declared name has been defined or not */
- for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ if (strcmp($2, ptr->name) == 0)
{
- if (strcmp($2, ptr->name) == 0)
- {
- /* re-definition is not allowed */
- mmerror(PARSE_ERROR, ET_ERROR, "name \"%s\" is already declared", ptr->name);
- }
+ /* re-definition is not allowed */
+ mmerror(PARSE_ERROR, ET_ERROR, "name \"%s\" is already declared", ptr->name);
}
+ }
- /* Add a new declared name into the g_declared_list */
- ptr = NULL;
- ptr = (struct declared_list *)mm_alloc(sizeof(struct declared_list));
- if (ptr)
- {
- /* initial definition */
- ptr -> name = $2;
- if (connection)
- ptr -> connection = mm_strdup(connection);
- else
- ptr -> connection = NULL;
-
- ptr -> next = g_declared_list;
- g_declared_list = ptr;
- }
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_list *) mm_alloc(sizeof(struct declared_list));
+ if (ptr)
+ {
+ /* initial definition */
+ ptr->name = $2;
+ if (connection)
+ ptr->connection = mm_strdup(connection);
+ else
+ ptr->connection = NULL;
- $$ = cat_str(3 , mm_strdup("/* declare "), mm_strdup($2), mm_strdup(" as an SQL identifier */"));
+ ptr->next = g_declared_list;
+ g_declared_list = ptr;
}
-;
+
+ $$ = cat_str(3, mm_strdup("/* declare "), mm_strdup($2), mm_strdup(" as an SQL identifier */"));
+ }
+ ;
/*
* Declare a prepared cursor. The syntax is different from the standard
* declare statement, so we create a new rule.
*/
-ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared_name
- {
- struct cursor *ptr, *this;
- char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : mm_strdup($2);
- int (* strcmp_fn)(const char *, const char *) = (($2[0] == ':' || $2[0] == '"') ? strcmp : pg_strcasecmp);
- struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
- char *comment;
- char *con;
-
- if (INFORMIX_MODE && pg_strcasecmp($2, "database") == 0)
- mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
-
- check_declared_list($7);
- con = connection ? connection : "NULL";
- for (ptr = cur; ptr != NULL; ptr = ptr->next)
+ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared_name
+ {
+ struct cursor *ptr,
+ *this;
+ char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : mm_strdup($2);
+ int (*strcmp_fn) (const char *, const char *) = (($2[0] == ':' || $2[0] == '"') ? strcmp : pg_strcasecmp);
+ struct variable *thisquery = (struct variable *) mm_alloc(sizeof(struct variable));
+ char *comment;
+ char *con;
+
+ if (INFORMIX_MODE && pg_strcasecmp($2, "database") == 0)
+ mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
+
+ check_declared_list($7);
+ con = connection ? connection : "NULL";
+ for (ptr = cur; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp_fn($2, ptr->name) == 0)
{
- if (strcmp_fn($2, ptr->name) == 0)
- {
- /* re-definition is a bug */
- if ($2[0] == ':')
- mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", $2+1);
- else
- mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", $2);
- }
+ /* re-definition is a bug */
+ if ($2[0] == ':')
+ mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", $2 + 1);
+ else
+ mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", $2);
}
+ }
- this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ this = (struct cursor *) mm_alloc(sizeof(struct cursor));
- /* initial definition */
- this->next = cur;
- this->name = $2;
- this->function = (current_function ? mm_strdup(current_function) : NULL);
- this->connection = connection ? mm_strdup(connection) : NULL;
- this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
- this->argsresult = NULL;
- this->argsresult_oos = NULL;
-
- thisquery->type = &ecpg_query;
- thisquery->brace_level = 0;
- thisquery->next = NULL;
- thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(, , __LINE__)") + strlen(con) + strlen($7));
- sprintf(thisquery->name, "ECPGprepared_statement(%s, %s, __LINE__)", con, $7);
-
- this->argsinsert = NULL;
- this->argsinsert_oos = NULL;
- if ($2[0] == ':')
- {
- struct variable *var = find_variable($2 + 1);
- remove_variable_from_list(&argsinsert, var);
- add_variable_to_head(&(this->argsinsert), var, &no_indicator);
- }
- add_variable_to_head(&(this->argsinsert), thisquery, &no_indicator);
+ /* initial definition */
+ this->next = cur;
+ this->name = $2;
+ this->function = (current_function ? mm_strdup(current_function) : NULL);
+ this->connection = connection ? mm_strdup(connection) : NULL;
+ this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
+ this->argsresult = NULL;
+ this->argsresult_oos = NULL;
- cur = this;
+ thisquery->type = &ecpg_query;
+ thisquery->brace_level = 0;
+ thisquery->next = NULL;
+ thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(, , __LINE__)") + strlen(con) + strlen($7));
+ sprintf(thisquery->name, "ECPGprepared_statement(%s, %s, __LINE__)", con, $7);
- comment = cat_str(3, mm_strdup("/*"), mm_strdup(this->command), mm_strdup("*/"));
+ this->argsinsert = NULL;
+ this->argsinsert_oos = NULL;
+ if ($2[0] == ':')
+ {
+ struct variable *var = find_variable($2 + 1);
- $$ = cat_str(2, adjust_outofscope_cursor_vars(this),
- comment);
+ remove_variable_from_list(&argsinsert, var);
+ add_variable_to_head(&(this->argsinsert), var, &no_indicator);
}
- ;
+ add_variable_to_head(&(this->argsinsert), thisquery, &no_indicator);
+
+ cur = this;
+
+ comment = cat_str(3, mm_strdup("/*"), mm_strdup(this->command), mm_strdup("*/"));
+
+ $$ = cat_str(2, adjust_outofscope_cursor_vars(this),
+ comment);
+ }
+ ;
ECPGExecuteImmediateStmt: EXECUTE IMMEDIATE execstring
- {
- /* execute immediate means prepare the statement and
- * immediately execute it */
- $$ = $3;
- };
+ {
+ /*
+ * execute immediate means prepare the statement and immediately
+ * execute it
+ */
+ $$ = $3;
+ }
+ ;
+
/*
* variable declaration outside exec sql declare block
*/
ECPGVarDeclaration: single_vt_declaration;
-single_vt_declaration: type_declaration { $$ = $1; }
- | var_declaration { $$ = $1; }
- ;
+single_vt_declaration: type_declaration
+ {
+ $$ = $1;
+ }
+ | var_declaration
+ {
+ $$ = $1;
+ }
+ ;
-precision: NumericOnly { $$ = $1; };
+precision: NumericOnly
+ {
+ $$ = $1;
+ }
+ ;
-opt_scale: ',' NumericOnly { $$ = $2; }
- | /* EMPTY */ { $$ = EMPTY; }
- ;
+opt_scale: ',' NumericOnly
+ {
+ $$ = $2;
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
-ecpg_interval: opt_interval { $$ = $1; }
- | YEAR_P TO MINUTE_P { $$ = mm_strdup("year to minute"); }
- | YEAR_P TO SECOND_P { $$ = mm_strdup("year to second"); }
- | DAY_P TO DAY_P { $$ = mm_strdup("day to day"); }
- | MONTH_P TO MONTH_P { $$ = mm_strdup("month to month"); }
- ;
+ecpg_interval: opt_interval { $$ = $1; }
+ | YEAR_P TO MINUTE_P { $$ = mm_strdup("year to minute"); }
+ | YEAR_P TO SECOND_P { $$ = mm_strdup("year to second"); }
+ | DAY_P TO DAY_P { $$ = mm_strdup("day to day"); }
+ | MONTH_P TO MONTH_P { $$ = mm_strdup("month to month"); }
+ ;
/*
* variable declaration inside exec sql declare block
*/
ECPGDeclaration: sql_startdeclare
- { fputs("/* exec sql begin declare section */", base_yyout); }
- var_type_declarations sql_enddeclare
- {
- fprintf(base_yyout, "%s/* exec sql end declare section */", $3);
- free($3);
- output_line_number();
- }
- ;
+ {
+ fputs("/* exec sql begin declare section */", base_yyout);
+ }
+ var_type_declarations sql_enddeclare
+ {
+ fprintf(base_yyout, "%s/* exec sql end declare section */", $3);
+ free($3);
+ output_line_number();
+ }
+ ;
-sql_startdeclare: ecpgstart BEGIN_P DECLARE SQL_SECTION ';' {};
+sql_startdeclare: ecpgstart BEGIN_P DECLARE SQL_SECTION ';'
+ {
+ }
+ ;
-sql_enddeclare: ecpgstart END_P DECLARE SQL_SECTION ';' {};
+sql_enddeclare: ecpgstart END_P DECLARE SQL_SECTION ';'
+ {
+ }
+ ;
-var_type_declarations: /*EMPTY*/ { $$ = EMPTY; }
- | vt_declarations { $$ = $1; }
- ;
+var_type_declarations: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | vt_declarations
+ {
+ $$ = $1;
+ }
+ ;
-vt_declarations: single_vt_declaration { $$ = $1; }
- | CPP_LINE { $$ = $1; }
- | vt_declarations single_vt_declaration { $$ = cat2_str($1, $2); }
- | vt_declarations CPP_LINE { $$ = cat2_str($1, $2); }
- ;
+vt_declarations: single_vt_declaration
+ {
+ $$ = $1;
+ }
+ | CPP_LINE
+ {
+ $$ = $1;
+ }
+ | vt_declarations single_vt_declaration
+ {
+ $$ = cat2_str($1, $2);
+ }
+ | vt_declarations CPP_LINE
+ {
+ $$ = cat2_str($1, $2);
+ }
+ ;
-variable_declarations: var_declaration { $$ = $1; }
- | variable_declarations var_declaration { $$ = cat2_str($1, $2); }
- ;
+variable_declarations: var_declaration
+ {
+ $$ = $1;
+ }
+ | variable_declarations var_declaration
+ {
+ $$ = cat2_str($1, $2);
+ }
+ ;
type_declaration: S_TYPEDEF
{
@@ -467,750 +612,885 @@ type_declaration: S_TYPEDEF
/* an initializer specified */
initializer = 0;
}
- var_type opt_pointer ECPGColLabel opt_array_bounds ';'
+ var_type opt_pointer ECPGColLabel opt_array_bounds ';'
{
add_typedef($5, $6.index1, $6.index2, $3.type_enum, $3.type_dimension, $3.type_index, initializer, *$4 ? 1 : 0);
fprintf(base_yyout, "typedef %s %s %s %s;\n", $3.type_str, *$4 ? "*" : "", $5, $6.str);
output_line_number();
$$ = mm_strdup("");
- };
+ }
+ ;
var_declaration:
- storage_declaration var_type
+ storage_declaration var_type
+ {
+ actual_type[struct_level].type_storage = $1;
+ actual_type[struct_level].type_enum = $2.type_enum;
+ actual_type[struct_level].type_str = $2.type_str;
+ actual_type[struct_level].type_dimension = $2.type_dimension;
+ actual_type[struct_level].type_index = $2.type_index;
+ actual_type[struct_level].type_sizeof = $2.type_sizeof;
+
+ actual_startline[struct_level] = hashline_number();
+ }
+ variable_list ';'
+ {
+ $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, mm_strdup(";\n"));
+ }
+ | var_type
+ {
+ actual_type[struct_level].type_storage = EMPTY;
+ actual_type[struct_level].type_enum = $1.type_enum;
+ actual_type[struct_level].type_str = $1.type_str;
+ actual_type[struct_level].type_dimension = $1.type_dimension;
+ actual_type[struct_level].type_index = $1.type_index;
+ actual_type[struct_level].type_sizeof = $1.type_sizeof;
+
+ actual_startline[struct_level] = hashline_number();
+ }
+ variable_list ';'
+ {
+ $$ = cat_str(4, actual_startline[struct_level], $1.type_str, $3, mm_strdup(";\n"));
+ }
+ | struct_union_type_with_symbol ';'
+ {
+ $$ = cat2_str($1, mm_strdup(";"));
+ }
+ ;
+
+opt_bit_field: ':' Iconst
+ {
+ $$ = cat2_str(mm_strdup(":"), $2);
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
+
+storage_declaration: storage_clause storage_modifier
+ {
+ $$ = cat2_str($1, $2);
+ }
+ | storage_clause
+ {
+ $$ = $1;
+ }
+ | storage_modifier
+ {
+ $$ = $1;
+ }
+ ;
+
+storage_clause: S_EXTERN { $$ = mm_strdup("extern"); }
+ | S_STATIC { $$ = mm_strdup("static"); }
+ | S_REGISTER { $$ = mm_strdup("register"); }
+ | S_AUTO { $$ = mm_strdup("auto"); }
+ ;
+
+storage_modifier: S_CONST { $$ = mm_strdup("const"); }
+ | S_VOLATILE { $$ = mm_strdup("volatile"); }
+ ;
+
+var_type: simple_type
+ {
+ $$.type_enum = $1;
+ $$.type_str = mm_strdup(ecpg_type_name($1));
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | struct_union_type
+ {
+ $$.type_str = $1;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+
+ if (strncmp($1, "struct", sizeof("struct") - 1) == 0)
{
- actual_type[struct_level].type_storage = $1;
- actual_type[struct_level].type_enum = $2.type_enum;
- actual_type[struct_level].type_str = $2.type_str;
- actual_type[struct_level].type_dimension = $2.type_dimension;
- actual_type[struct_level].type_index = $2.type_index;
- actual_type[struct_level].type_sizeof = $2.type_sizeof;
-
- actual_startline[struct_level] = hashline_number();
+ $$.type_enum = ECPGt_struct;
+ $$.type_sizeof = ECPGstruct_sizeof;
}
- variable_list ';'
+ else
{
- $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, mm_strdup(";\n"));
+ $$.type_enum = ECPGt_union;
+ $$.type_sizeof = NULL;
}
- | var_type
+ }
+ | enum_type
+ {
+ $$.type_str = $1;
+ $$.type_enum = ECPGt_int;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | NUMERIC '(' precision opt_scale ')'
+ {
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | DECIMAL_P '(' precision opt_scale ')'
+ {
+ $$.type_enum = ECPGt_decimal;
+ $$.type_str = mm_strdup("decimal");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | IDENT '(' precision opt_scale ')'
+ {
+ /*
+ * In C parsing mode, NUMERIC and DECIMAL are not keywords, so they
+ * will show up here as a plain identifier, and we need this duplicate
+ * code to recognize them.
+ */
+ if (strcmp($1, "numeric") == 0)
{
- actual_type[struct_level].type_storage = EMPTY;
- actual_type[struct_level].type_enum = $1.type_enum;
- actual_type[struct_level].type_str = $1.type_str;
- actual_type[struct_level].type_dimension = $1.type_dimension;
- actual_type[struct_level].type_index = $1.type_index;
- actual_type[struct_level].type_sizeof = $1.type_sizeof;
-
- actual_startline[struct_level] = hashline_number();
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
}
- variable_list ';'
+ else if (strcmp($1, "decimal") == 0)
{
- $$ = cat_str(4, actual_startline[struct_level], $1.type_str, $3, mm_strdup(";\n"));
+ $$.type_enum = ECPGt_decimal;
+ $$.type_str = mm_strdup("decimal");
}
- | struct_union_type_with_symbol ';'
+ else
{
- $$ = cat2_str($1, mm_strdup(";"));
+ mmerror(PARSE_ERROR, ET_ERROR, "only data types numeric and decimal have precision/scale argument");
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
}
- ;
-opt_bit_field: ':' Iconst { $$ =cat2_str(mm_strdup(":"), $2); }
- | /* EMPTY */ { $$ = EMPTY; }
- ;
-
-storage_declaration: storage_clause storage_modifier
- {$$ = cat2_str ($1, $2); }
- | storage_clause {$$ = $1; }
- | storage_modifier {$$ = $1; }
- ;
-
-storage_clause : S_EXTERN { $$ = mm_strdup("extern"); }
- | S_STATIC { $$ = mm_strdup("static"); }
- | S_REGISTER { $$ = mm_strdup("register"); }
- | S_AUTO { $$ = mm_strdup("auto"); }
- ;
-
-storage_modifier : S_CONST { $$ = mm_strdup("const"); }
- | S_VOLATILE { $$ = mm_strdup("volatile"); }
- ;
-
-var_type: simple_type
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | VARCHAR
+ {
+ $$.type_enum = ECPGt_varchar;
+ $$.type_str = EMPTY; /* mm_strdup("varchar"); */
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | FLOAT_P
+ {
+ /* Note: DOUBLE is handled in simple_type */
+ $$.type_enum = ECPGt_float;
+ $$.type_str = mm_strdup("float");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | NUMERIC
+ {
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | DECIMAL_P
+ {
+ $$.type_enum = ECPGt_decimal;
+ $$.type_str = mm_strdup("decimal");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | TIMESTAMP
+ {
+ $$.type_enum = ECPGt_timestamp;
+ $$.type_str = mm_strdup("timestamp");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | STRING_P
+ {
+ if (INFORMIX_MODE)
{
- $$.type_enum = $1;
- $$.type_str = mm_strdup(ecpg_type_name($1));
+ /* In Informix mode, "string" is automatically a typedef */
+ $$.type_enum = ECPGt_string;
+ $$.type_str = mm_strdup("char");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | struct_union_type
+ else
{
- $$.type_str = $1;
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
+ /* Otherwise, legal only if user typedef'ed it */
+ struct typedefs *this = get_typedef("string", false);
- if (strncmp($1, "struct", sizeof("struct")-1) == 0)
- {
- $$.type_enum = ECPGt_struct;
- $$.type_sizeof = ECPGstruct_sizeof;
- }
+ $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? EMPTY : mm_strdup(this->name);
+ $$.type_enum = this->type->type_enum;
+ $$.type_dimension = this->type->type_dimension;
+ $$.type_index = this->type->type_index;
+ if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
+ $$.type_sizeof = this->type->type_sizeof;
else
- {
- $$.type_enum = ECPGt_union;
- $$.type_sizeof = NULL;
- }
+ $$.type_sizeof = cat_str(3, mm_strdup("sizeof("), mm_strdup(this->name), mm_strdup(")"));
+
+ struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
}
- | enum_type
+ }
+ | INTERVAL ecpg_interval
+ {
+ $$.type_enum = ECPGt_interval;
+ $$.type_str = mm_strdup("interval");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | IDENT ecpg_interval
+ {
+ /*
+ * In C parsing mode, the above SQL type names are not keywords, so
+ * they will show up here as a plain identifier, and we need this
+ * duplicate code to recognize them.
+ *
+ * Note that we also handle the type names bytea, date, and datetime
+ * here, but not above because those are not currently SQL keywords.
+ * If they ever become so, they must gain duplicate productions above.
+ */
+ if (strlen($2) != 0 && strcmp($1, "datetime") != 0 && strcmp($1, "interval") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "interval specification not allowed here");
+
+ if (strcmp($1, "varchar") == 0)
{
- $$.type_str = $1;
- $$.type_enum = ECPGt_int;
+ $$.type_enum = ECPGt_varchar;
+ $$.type_str = EMPTY; /* mm_strdup("varchar"); */
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | NUMERIC '(' precision opt_scale ')'
+ else if (strcmp($1, "bytea") == 0)
{
- $$.type_enum = ECPGt_numeric;
- $$.type_str = mm_strdup("numeric");
+ $$.type_enum = ECPGt_bytea;
+ $$.type_str = EMPTY;
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | DECIMAL_P '(' precision opt_scale ')'
+ else if (strcmp($1, "float") == 0)
{
- $$.type_enum = ECPGt_decimal;
- $$.type_str = mm_strdup("decimal");
+ $$.type_enum = ECPGt_float;
+ $$.type_str = mm_strdup("float");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | IDENT '(' precision opt_scale ')'
+ else if (strcmp($1, "double") == 0)
{
- /*
- * In C parsing mode, NUMERIC and DECIMAL are not keywords, so
- * they will show up here as a plain identifier, and we need
- * this duplicate code to recognize them.
- */
- if (strcmp($1, "numeric") == 0)
- {
- $$.type_enum = ECPGt_numeric;
- $$.type_str = mm_strdup("numeric");
- }
- else if (strcmp($1, "decimal") == 0)
- {
- $$.type_enum = ECPGt_decimal;
- $$.type_str = mm_strdup("decimal");
- }
- else
- {
- mmerror(PARSE_ERROR, ET_ERROR, "only data types numeric and decimal have precision/scale argument");
- $$.type_enum = ECPGt_numeric;
- $$.type_str = mm_strdup("numeric");
- }
-
+ $$.type_enum = ECPGt_double;
+ $$.type_str = mm_strdup("double");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | VARCHAR
+ else if (strcmp($1, "numeric") == 0)
{
- $$.type_enum = ECPGt_varchar;
- $$.type_str = EMPTY; /*mm_strdup("varchar");*/
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | FLOAT_P
+ else if (strcmp($1, "decimal") == 0)
{
- /* Note: DOUBLE is handled in simple_type */
- $$.type_enum = ECPGt_float;
- $$.type_str = mm_strdup("float");
+ $$.type_enum = ECPGt_decimal;
+ $$.type_str = mm_strdup("decimal");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | NUMERIC
+ else if (strcmp($1, "date") == 0)
{
- $$.type_enum = ECPGt_numeric;
- $$.type_str = mm_strdup("numeric");
+ $$.type_enum = ECPGt_date;
+ $$.type_str = mm_strdup("date");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | DECIMAL_P
+ else if (strcmp($1, "timestamp") == 0)
{
- $$.type_enum = ECPGt_decimal;
- $$.type_str = mm_strdup("decimal");
+ $$.type_enum = ECPGt_timestamp;
+ $$.type_str = mm_strdup("timestamp");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | TIMESTAMP
+ else if (strcmp($1, "interval") == 0)
{
- $$.type_enum = ECPGt_timestamp;
- $$.type_str = mm_strdup("timestamp");
+ $$.type_enum = ECPGt_interval;
+ $$.type_str = mm_strdup("interval");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | STRING_P
+ else if (strcmp($1, "datetime") == 0)
{
- if (INFORMIX_MODE)
- {
- /* In Informix mode, "string" is automatically a typedef */
- $$.type_enum = ECPGt_string;
- $$.type_str = mm_strdup("char");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else
- {
- /* Otherwise, legal only if user typedef'ed it */
- struct typedefs *this = get_typedef("string", false);
-
- $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? EMPTY : mm_strdup(this->name);
- $$.type_enum = this->type->type_enum;
- $$.type_dimension = this->type->type_dimension;
- $$.type_index = this->type->type_index;
- if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
- $$.type_sizeof = this->type->type_sizeof;
- else
- $$.type_sizeof = cat_str(3, mm_strdup("sizeof("), mm_strdup(this->name), mm_strdup(")"));
-
- struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
- }
- }
- | INTERVAL ecpg_interval
- {
- $$.type_enum = ECPGt_interval;
- $$.type_str = mm_strdup("interval");
+ $$.type_enum = ECPGt_timestamp;
+ $$.type_str = mm_strdup("timestamp");
$$.type_dimension = mm_strdup("-1");
$$.type_index = mm_strdup("-1");
$$.type_sizeof = NULL;
}
- | IDENT ecpg_interval
+ else if ((strcmp($1, "string") == 0) && INFORMIX_MODE)
{
- /*
- * In C parsing mode, the above SQL type names are not keywords,
- * so they will show up here as a plain identifier, and we need
- * this duplicate code to recognize them.
- *
- * Note that we also handle the type names bytea, date, and
- * datetime here, but not above because those are not currently
- * SQL keywords. If they ever become so, they must gain duplicate
- * productions above.
- */
- if (strlen($2) != 0 && strcmp ($1, "datetime") != 0 && strcmp ($1, "interval") != 0)
- mmerror (PARSE_ERROR, ET_ERROR, "interval specification not allowed here");
-
- if (strcmp($1, "varchar") == 0)
- {
- $$.type_enum = ECPGt_varchar;
- $$.type_str = EMPTY; /*mm_strdup("varchar");*/
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "bytea") == 0)
- {
- $$.type_enum = ECPGt_bytea;
- $$.type_str = EMPTY;
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "float") == 0)
- {
- $$.type_enum = ECPGt_float;
- $$.type_str = mm_strdup("float");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "double") == 0)
- {
- $$.type_enum = ECPGt_double;
- $$.type_str = mm_strdup("double");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "numeric") == 0)
- {
- $$.type_enum = ECPGt_numeric;
- $$.type_str = mm_strdup("numeric");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "decimal") == 0)
- {
- $$.type_enum = ECPGt_decimal;
- $$.type_str = mm_strdup("decimal");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "date") == 0)
- {
- $$.type_enum = ECPGt_date;
- $$.type_str = mm_strdup("date");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "timestamp") == 0)
- {
- $$.type_enum = ECPGt_timestamp;
- $$.type_str = mm_strdup("timestamp");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "interval") == 0)
- {
- $$.type_enum = ECPGt_interval;
- $$.type_str = mm_strdup("interval");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if (strcmp($1, "datetime") == 0)
- {
- $$.type_enum = ECPGt_timestamp;
- $$.type_str = mm_strdup("timestamp");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else if ((strcmp($1, "string") == 0) && INFORMIX_MODE)
- {
- $$.type_enum = ECPGt_string;
- $$.type_str = mm_strdup("char");
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = NULL;
- }
- else
- {
- /* Otherwise, it must be a user-defined typedef name */
- struct typedefs *this = get_typedef($1, false);
-
- $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? EMPTY : mm_strdup(this->name);
- $$.type_enum = this->type->type_enum;
- $$.type_dimension = this->type->type_dimension;
- $$.type_index = this->type->type_index;
- if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
- $$.type_sizeof = this->type->type_sizeof;
- else
- $$.type_sizeof = cat_str(3, mm_strdup("sizeof("), mm_strdup(this->name), mm_strdup(")"));
-
- struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
- }
+ $$.type_enum = ECPGt_string;
+ $$.type_str = mm_strdup("char");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
}
- | s_struct_union_symbol
+ else
{
- /* this is for named structs/unions */
- char *name;
- struct typedefs *this;
- bool forward = (forward_name != NULL && strcmp($1.symbol, forward_name) == 0 && strcmp($1.su, "struct") == 0);
-
- name = cat2_str($1.su, $1.symbol);
- /* Do we have a forward definition? */
- if (!forward)
- {
- /* No */
+ /* Otherwise, it must be a user-defined typedef name */
+ struct typedefs *this = get_typedef($1, false);
- this = get_typedef(name, false);
- $$.type_str = mm_strdup(this->name);
- $$.type_enum = this->type->type_enum;
- $$.type_dimension = this->type->type_dimension;
- $$.type_index = this->type->type_index;
+ $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? EMPTY : mm_strdup(this->name);
+ $$.type_enum = this->type->type_enum;
+ $$.type_dimension = this->type->type_dimension;
+ $$.type_index = this->type->type_index;
+ if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
$$.type_sizeof = this->type->type_sizeof;
- struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
- free(name);
- }
else
- {
- $$.type_str = name;
- $$.type_enum = ECPGt_long;
- $$.type_dimension = mm_strdup("-1");
- $$.type_index = mm_strdup("-1");
- $$.type_sizeof = mm_strdup("");
- struct_member_list[struct_level] = NULL;
- }
+ $$.type_sizeof = cat_str(3, mm_strdup("sizeof("), mm_strdup(this->name), mm_strdup(")"));
+
+ struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
}
- ;
+ }
+ | s_struct_union_symbol
+ {
+ /* this is for named structs/unions */
+ char *name;
+ struct typedefs *this;
+ bool forward = (forward_name != NULL && strcmp($1.symbol, forward_name) == 0 && strcmp($1.su, "struct") == 0);
+
+ name = cat2_str($1.su, $1.symbol);
+ /* Do we have a forward definition? */
+ if (!forward)
+ {
+ /* No */
+
+ this = get_typedef(name, false);
+ $$.type_str = mm_strdup(this->name);
+ $$.type_enum = this->type->type_enum;
+ $$.type_dimension = this->type->type_dimension;
+ $$.type_index = this->type->type_index;
+ $$.type_sizeof = this->type->type_sizeof;
+ struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
+ free(name);
+ }
+ else
+ {
+ $$.type_str = name;
+ $$.type_enum = ECPGt_long;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = mm_strdup("");
+ struct_member_list[struct_level] = NULL;
+ }
+ }
+ ;
enum_type: ENUM_P symbol enum_definition
- { $$ = cat_str(3, mm_strdup("enum"), $2, $3); }
- | ENUM_P enum_definition
- { $$ = cat2_str(mm_strdup("enum"), $2); }
- | ENUM_P symbol
- { $$ = cat2_str(mm_strdup("enum"), $2); }
- ;
+ {
+ $$ = cat_str(3, mm_strdup("enum"), $2, $3);
+ }
+ | ENUM_P enum_definition
+ {
+ $$ = cat2_str(mm_strdup("enum"), $2);
+ }
+ | ENUM_P symbol
+ {
+ $$ = cat2_str(mm_strdup("enum"), $2);
+ }
+ ;
enum_definition: '{' c_list '}'
- { $$ = cat_str(3, mm_strdup("{"), $2, mm_strdup("}")); };
+ {
+ $$ = cat_str(3, mm_strdup("{"), $2, mm_strdup("}"));
+ }
+ ;
struct_union_type_with_symbol: s_struct_union_symbol
- {
- struct_member_list[struct_level++] = NULL;
- if (struct_level >= STRUCT_DEPTH)
- mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
- forward_name = mm_strdup($1.symbol);
- }
- '{' variable_declarations '}'
- {
- struct typedefs *ptr, *this;
- struct this_type su_type;
+ {
+ struct_member_list[struct_level++] = NULL;
+ if (struct_level >= STRUCT_DEPTH)
+ mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
+ forward_name = mm_strdup($1.symbol);
+ }
+ '{' variable_declarations '}'
+ {
+ struct typedefs *ptr,
+ *this;
+ struct this_type su_type;
+
+ ECPGfree_struct_member(struct_member_list[struct_level]);
+ struct_member_list[struct_level] = NULL;
+ struct_level--;
+ if (strncmp($1.su, "struct", sizeof("struct") - 1) == 0)
+ su_type.type_enum = ECPGt_struct;
+ else
+ su_type.type_enum = ECPGt_union;
+ su_type.type_str = cat2_str($1.su, $1.symbol);
+ free(forward_name);
+ forward_name = NULL;
+
+ /*
+ * This is essentially a typedef but needs the keyword struct/union as
+ * well. So we create the typedef for each struct definition with
+ * symbol
+ */
+ for (ptr = types; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp(su_type.type_str, ptr->name) == 0)
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "type \"%s\" is already defined", su_type.type_str);
+ }
+
+ this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
+
+ /* initial definition */
+ this->next = types;
+ this->name = mm_strdup(su_type.type_str);
+ this->brace_level = braces_open;
+ this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
+ this->type->type_enum = su_type.type_enum;
+ this->type->type_str = mm_strdup(su_type.type_str);
+ this->type->type_dimension = mm_strdup("-1"); /* dimension of array */
+ this->type->type_index = mm_strdup("-1"); /* length of string */
+ this->type->type_sizeof = ECPGstruct_sizeof;
+ this->struct_member_list = struct_member_list[struct_level];
+
+ types = this;
+ $$ = cat_str(4, su_type.type_str, mm_strdup("{"), $4, mm_strdup("}"));
+ }
+ ;
- ECPGfree_struct_member(struct_member_list[struct_level]);
- struct_member_list[struct_level] = NULL;
- struct_level--;
- if (strncmp($1.su, "struct", sizeof("struct")-1) == 0)
- su_type.type_enum = ECPGt_struct;
- else
- su_type.type_enum = ECPGt_union;
- su_type.type_str = cat2_str($1.su, $1.symbol);
- free(forward_name);
- forward_name = NULL;
-
- /* This is essentially a typedef but needs the keyword struct/union as well.
- * So we create the typedef for each struct definition with symbol */
- for (ptr = types; ptr != NULL; ptr = ptr->next)
- {
- if (strcmp(su_type.type_str, ptr->name) == 0)
- /* re-definition is a bug */
- mmerror(PARSE_ERROR, ET_ERROR, "type \"%s\" is already defined", su_type.type_str);
- }
+struct_union_type: struct_union_type_with_symbol
+ {
+ $$ = $1;
+ }
+ | s_struct_union
+ {
+ struct_member_list[struct_level++] = NULL;
+ if (struct_level >= STRUCT_DEPTH)
+ mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
+ }
+ '{' variable_declarations '}'
+ {
+ ECPGfree_struct_member(struct_member_list[struct_level]);
+ struct_member_list[struct_level] = NULL;
+ struct_level--;
+ $$ = cat_str(4, $1, mm_strdup("{"), $4, mm_strdup("}"));
+ }
+ ;
- this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
+s_struct_union_symbol: SQL_STRUCT symbol
+ {
+ $$.su = mm_strdup("struct");
+ $$.symbol = $2;
+ ECPGstruct_sizeof = cat_str(3, mm_strdup("sizeof("), cat2_str(mm_strdup($$.su), mm_strdup($$.symbol)), mm_strdup(")"));
+ }
+ | UNION symbol
+ {
+ $$.su = mm_strdup("union");
+ $$.symbol = $2;
+ }
+ ;
- /* initial definition */
- this->next = types;
- this->name = mm_strdup(su_type.type_str);
- this->brace_level = braces_open;
- this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
- this->type->type_enum = su_type.type_enum;
- this->type->type_str = mm_strdup(su_type.type_str);
- this->type->type_dimension = mm_strdup("-1"); /* dimension of array */
- this->type->type_index = mm_strdup("-1"); /* length of string */
- this->type->type_sizeof = ECPGstruct_sizeof;
- this->struct_member_list = struct_member_list[struct_level];
-
- types = this;
- $$ = cat_str(4, su_type.type_str, mm_strdup("{"), $4, mm_strdup("}"));
- }
- ;
+s_struct_union: SQL_STRUCT
+ {
+ ECPGstruct_sizeof = mm_strdup(""); /* This must not be NULL to
+ * distinguish from simple types. */
+ $$ = mm_strdup("struct");
+ }
+ | UNION
+ {
+ $$ = mm_strdup("union");
+ }
+ ;
-struct_union_type: struct_union_type_with_symbol { $$ = $1; }
- | s_struct_union
- {
- struct_member_list[struct_level++] = NULL;
- if (struct_level >= STRUCT_DEPTH)
- mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
- }
- '{' variable_declarations '}'
- {
- ECPGfree_struct_member(struct_member_list[struct_level]);
- struct_member_list[struct_level] = NULL;
- struct_level--;
- $$ = cat_str(4, $1, mm_strdup("{"), $4, mm_strdup("}"));
- }
- ;
+simple_type: unsigned_type { $$ = $1; }
+ | opt_signed signed_type { $$ = $2; }
+ ;
-s_struct_union_symbol: SQL_STRUCT symbol
- {
- $$.su = mm_strdup("struct");
- $$.symbol = $2;
- ECPGstruct_sizeof = cat_str(3, mm_strdup("sizeof("), cat2_str(mm_strdup($$.su), mm_strdup($$.symbol)), mm_strdup(")"));
- }
- | UNION symbol
- {
- $$.su = mm_strdup("union");
- $$.symbol = $2;
- }
- ;
+unsigned_type: SQL_UNSIGNED SQL_SHORT { $$ = ECPGt_unsigned_short; }
+ | SQL_UNSIGNED SQL_SHORT INT_P { $$ = ECPGt_unsigned_short; }
+ | SQL_UNSIGNED { $$ = ECPGt_unsigned_int; }
+ | SQL_UNSIGNED INT_P { $$ = ECPGt_unsigned_int; }
+ | SQL_UNSIGNED SQL_LONG { $$ = ECPGt_unsigned_long; }
+ | SQL_UNSIGNED SQL_LONG INT_P { $$ = ECPGt_unsigned_long; }
+ | SQL_UNSIGNED SQL_LONG SQL_LONG { $$ = ECPGt_unsigned_long_long; }
+ | SQL_UNSIGNED SQL_LONG SQL_LONG INT_P { $$ = ECPGt_unsigned_long_long; }
+ | SQL_UNSIGNED CHAR_P { $$ = ECPGt_unsigned_char; }
+ ;
-s_struct_union: SQL_STRUCT
- {
- ECPGstruct_sizeof = mm_strdup(""); /* This must not be NULL to distinguish from simple types. */
- $$ = mm_strdup("struct");
- }
- | UNION
- {
- $$ = mm_strdup("union");
- }
- ;
-
-simple_type: unsigned_type { $$=$1; }
- | opt_signed signed_type { $$=$2; }
- ;
-
-unsigned_type: SQL_UNSIGNED SQL_SHORT { $$ = ECPGt_unsigned_short; }
- | SQL_UNSIGNED SQL_SHORT INT_P { $$ = ECPGt_unsigned_short; }
- | SQL_UNSIGNED { $$ = ECPGt_unsigned_int; }
- | SQL_UNSIGNED INT_P { $$ = ECPGt_unsigned_int; }
- | SQL_UNSIGNED SQL_LONG { $$ = ECPGt_unsigned_long; }
- | SQL_UNSIGNED SQL_LONG INT_P { $$ = ECPGt_unsigned_long; }
- | SQL_UNSIGNED SQL_LONG SQL_LONG { $$ = ECPGt_unsigned_long_long; }
- | SQL_UNSIGNED SQL_LONG SQL_LONG INT_P { $$ = ECPGt_unsigned_long_long; }
- | SQL_UNSIGNED CHAR_P { $$ = ECPGt_unsigned_char; }
- ;
-
-signed_type: SQL_SHORT { $$ = ECPGt_short; }
- | SQL_SHORT INT_P { $$ = ECPGt_short; }
- | INT_P { $$ = ECPGt_int; }
- | SQL_LONG { $$ = ECPGt_long; }
- | SQL_LONG INT_P { $$ = ECPGt_long; }
- | SQL_LONG SQL_LONG { $$ = ECPGt_long_long; }
- | SQL_LONG SQL_LONG INT_P { $$ = ECPGt_long_long; }
- | SQL_BOOL { $$ = ECPGt_bool; }
- | CHAR_P { $$ = ECPGt_char; }
- | DOUBLE_P { $$ = ECPGt_double; }
- ;
+signed_type: SQL_SHORT { $$ = ECPGt_short; }
+ | SQL_SHORT INT_P { $$ = ECPGt_short; }
+ | INT_P { $$ = ECPGt_int; }
+ | SQL_LONG { $$ = ECPGt_long; }
+ | SQL_LONG INT_P { $$ = ECPGt_long; }
+ | SQL_LONG SQL_LONG { $$ = ECPGt_long_long; }
+ | SQL_LONG SQL_LONG INT_P { $$ = ECPGt_long_long; }
+ | SQL_BOOL { $$ = ECPGt_bool; }
+ | CHAR_P { $$ = ECPGt_char; }
+ | DOUBLE_P { $$ = ECPGt_double; }
+ ;
opt_signed: SQL_SIGNED
- | /* EMPTY */
- ;
+ | /* EMPTY */
+ ;
variable_list: variable
- { $$ = $1; }
- | variable_list ',' variable
- {
- if (actual_type[struct_level].type_enum == ECPGt_varchar || actual_type[struct_level].type_enum == ECPGt_bytea)
- $$ = cat_str(4, $1, mm_strdup(";"), mm_strdup(actual_type[struct_level].type_storage), $3);
- else
- $$ = cat_str(3, $1, mm_strdup(","), $3);
- }
- ;
+ {
+ $$ = $1;
+ }
+ | variable_list ',' variable
+ {
+ if (actual_type[struct_level].type_enum == ECPGt_varchar || actual_type[struct_level].type_enum == ECPGt_bytea)
+ $$ = cat_str(4, $1, mm_strdup(";"), mm_strdup(actual_type[struct_level].type_storage), $3);
+ else
+ $$ = cat_str(3, $1, mm_strdup(","), $3);
+ }
+ ;
variable: opt_pointer ECPGColLabel opt_array_bounds opt_bit_field opt_initializer
- {
- struct ECPGtype * type;
- char *dimension = $3.index1; /* dimension of array */
- char *length = $3.index2; /* length of string */
- char *dim_str;
- char *vcn;
- int *varlen_type_counter;
- char *struct_name;
-
- adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1), false);
- switch (actual_type[struct_level].type_enum)
- {
- case ECPGt_struct:
- case ECPGt_union:
- if (atoi(dimension) < 0)
- type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_str, actual_type[struct_level].type_sizeof);
- else
- type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_str, actual_type[struct_level].type_sizeof), dimension);
+ {
+ struct ECPGtype *type;
+ char *dimension = $3.index1; /* dimension of array */
+ char *length = $3.index2; /* length of string */
+ char *dim_str;
+ char *vcn;
+ int *varlen_type_counter;
+ char *struct_name;
+
+ adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1), false);
+ switch (actual_type[struct_level].type_enum)
+ {
+ case ECPGt_struct:
+ case ECPGt_union:
+ if (atoi(dimension) < 0)
+ type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_str, actual_type[struct_level].type_sizeof);
+ else
+ type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_str, actual_type[struct_level].type_sizeof), dimension);
- $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
- break;
+ $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
+ break;
- case ECPGt_varchar:
- case ECPGt_bytea:
- if (actual_type[struct_level].type_enum == ECPGt_varchar)
- {
- varlen_type_counter = &varchar_counter;
- struct_name = " struct varchar_";
- }
- else
- {
- varlen_type_counter = &bytea_counter;
- struct_name = " struct bytea_";
- }
- if (atoi(dimension) < 0)
- type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter);
- else
- type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter), dimension);
+ case ECPGt_varchar:
+ case ECPGt_bytea:
+ if (actual_type[struct_level].type_enum == ECPGt_varchar)
+ {
+ varlen_type_counter = &varchar_counter;
+ struct_name = " struct varchar_";
+ }
+ else
+ {
+ varlen_type_counter = &bytea_counter;
+ struct_name = " struct bytea_";
+ }
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter), dimension);
- if (strcmp(dimension, "0") == 0 || abs(atoi(dimension)) == 1)
- dim_str=mm_strdup("");
- else
- dim_str=cat_str(3, mm_strdup("["), mm_strdup(dimension), mm_strdup("]"));
- /* cannot check for atoi <= 0 because a defined constant will yield 0 here as well */
- if (atoi(length) < 0 || strcmp(length, "0") == 0)
- mmerror(PARSE_ERROR, ET_ERROR, "pointers to varchar are not implemented");
-
- /* make sure varchar struct name is unique by adding a unique counter to its definition */
- vcn = (char *) mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- sprintf(vcn, "%d", *varlen_type_counter);
- if (strcmp(dimension, "0") == 0)
- $$ = cat_str(7, make2_str(mm_strdup(struct_name), vcn), mm_strdup(" { int len; char arr["), mm_strdup(length), mm_strdup("]; } *"), mm_strdup($2), $4, $5);
- else
- $$ = cat_str(8, make2_str(mm_strdup(struct_name), vcn), mm_strdup(" { int len; char arr["), mm_strdup(length), mm_strdup("]; } "), mm_strdup($2), dim_str, $4, $5);
- (*varlen_type_counter)++;
- break;
+ if (strcmp(dimension, "0") == 0 || abs(atoi(dimension)) == 1)
+ dim_str = mm_strdup("");
+ else
+ dim_str = cat_str(3, mm_strdup("["), mm_strdup(dimension), mm_strdup("]"));
+
+ /*
+ * cannot check for atoi <= 0 because a defined constant will
+ * yield 0 here as well
+ */
+ if (atoi(length) < 0 || strcmp(length, "0") == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "pointers to varchar are not implemented");
+
+ /*
+ * make sure varchar struct name is unique by adding a unique
+ * counter to its definition
+ */
+ vcn = (char *) mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ sprintf(vcn, "%d", *varlen_type_counter);
+ if (strcmp(dimension, "0") == 0)
+ $$ = cat_str(7, make2_str(mm_strdup(struct_name), vcn), mm_strdup(" { int len; char arr["), mm_strdup(length), mm_strdup("]; } *"), mm_strdup($2), $4, $5);
+ else
+ $$ = cat_str(8, make2_str(mm_strdup(struct_name), vcn), mm_strdup(" { int len; char arr["), mm_strdup(length), mm_strdup("]; } "), mm_strdup($2), dim_str, $4, $5);
+ (*varlen_type_counter)++;
+ break;
+
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ case ECPGt_string:
+ if (atoi(dimension) == -1)
+ {
+ int i = strlen($5);
- case ECPGt_char:
- case ECPGt_unsigned_char:
- case ECPGt_string:
- if (atoi(dimension) == -1)
+ if (atoi(length) == -1 && i > 0) /* char <var>[] =
+ * "string" */
{
- int i = strlen($5);
-
- if (atoi(length) == -1 && i > 0) /* char <var>[] = "string" */
- {
- /* if we have an initializer but no string size set, let's use the initializer's length */
- free(length);
- length = mm_alloc(i+sizeof("sizeof()"));
- sprintf(length, "sizeof(%s)", $5+2);
- }
- type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0);
+ /*
+ * if we have an initializer but no string size set,
+ * let's use the initializer's length
+ */
+ free(length);
+ length = mm_alloc(i + sizeof("sizeof()"));
+ sprintf(length, "sizeof(%s)", $5 + 2);
}
- else
- type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0), dimension);
+ type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0);
+ }
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0), dimension);
- $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
- break;
+ $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
+ break;
- default:
- if (atoi(dimension) < 0)
- type = ECPGmake_simple_type(actual_type[struct_level].type_enum, mm_strdup("1"), 0);
- else
- type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, mm_strdup("1"), 0), dimension);
+ default:
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type(actual_type[struct_level].type_enum, mm_strdup("1"), 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, mm_strdup("1"), 0), dimension);
- $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
- break;
- }
+ $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
+ break;
+ }
- if (struct_level == 0)
- new_variable($2, type, braces_open);
- else
- ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
+ if (struct_level == 0)
+ new_variable($2, type, braces_open);
+ else
+ ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
- free($2);
- }
- ;
+ free($2);
+ }
+ ;
-opt_initializer: /*EMPTY*/
- { $$ = EMPTY; }
- | '=' c_term
- {
- initializer = 1;
- $$ = cat2_str(mm_strdup("="), $2);
- }
- ;
+opt_initializer: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | '=' c_term
+ {
+ initializer = 1;
+ $$ = cat2_str(mm_strdup("="), $2);
+ }
+ ;
-opt_pointer: /*EMPTY*/ { $$ = EMPTY; }
- | '*' { $$ = mm_strdup("*"); }
- | '*' '*' { $$ = mm_strdup("**"); }
- ;
+opt_pointer: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | '*'
+ {
+ $$ = mm_strdup("*");
+ }
+ | '*' '*'
+ {
+ $$ = mm_strdup("**");
+ }
+ ;
/*
* We try to simulate the correct DECLARE syntax here so we get dynamic SQL
*/
ECPGDeclare: DECLARE STATEMENT ecpg_ident
- {
- /* this is only supported for compatibility */
- $$ = cat_str(3, mm_strdup("/* declare statement"), $3, mm_strdup("*/"));
- }
- ;
+ {
+ /* this is only supported for compatibility */
+ $$ = cat_str(3, mm_strdup("/* declare statement"), $3, mm_strdup("*/"));
+ }
+ ;
/*
* the exec sql disconnect statement: disconnect from the given database
*/
-ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; }
- ;
+ECPGDisconnect: SQL_DISCONNECT dis_name
+ {
+ $$ = $2;
+ }
+ ;
-dis_name: connection_object { $$ = $1; }
- | CURRENT_P { $$ = mm_strdup("\"CURRENT\""); }
- | ALL { $$ = mm_strdup("\"ALL\""); }
- | /* EMPTY */ { $$ = mm_strdup("\"CURRENT\""); }
- ;
+dis_name: connection_object
+ {
+ $$ = $1;
+ }
+ | CURRENT_P
+ {
+ $$ = mm_strdup("\"CURRENT\"");
+ }
+ | ALL
+ {
+ $$ = mm_strdup("\"ALL\"");
+ }
+ | /* EMPTY */
+ {
+ $$ = mm_strdup("\"CURRENT\"");
+ }
+ ;
-connection_object: name { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
- | DEFAULT { $$ = mm_strdup("\"DEFAULT\""); }
- | char_variable { $$ = $1; }
- ;
+connection_object: name
+ {
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ | DEFAULT
+ {
+ $$ = mm_strdup("\"DEFAULT\"");
+ }
+ | char_variable
+ {
+ $$ = $1;
+ }
+ ;
execstring: char_variable
- { $$ = $1; }
- | CSTRING
- { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
- ;
+ {
+ $$ = $1;
+ }
+ | CSTRING
+ {
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ ;
/*
* the exec sql free command to deallocate a previously
* prepared statement
*/
-ECPGFree: SQL_FREE cursor_name { $$ = $2; }
- | SQL_FREE ALL { $$ = mm_strdup("all"); }
- ;
+ECPGFree: SQL_FREE cursor_name
+ {
+ $$ = $2;
+ }
+ | SQL_FREE ALL
+ {
+ $$ = mm_strdup("all");
+ }
+ ;
/*
* open is an open cursor, at the moment this has to be removed
*/
ECPGOpen: SQL_OPEN cursor_name opt_ecpg_using
- {
- if ($2[0] == ':')
- remove_variable_from_list(&argsinsert, find_variable($2 + 1));
- $$ = $2;
- }
- ;
+ {
+ if ($2[0] == ':')
+ remove_variable_from_list(&argsinsert, find_variable($2 + 1));
+ $$ = $2;
+ }
+ ;
-opt_ecpg_using: /*EMPTY*/ { $$ = EMPTY; }
- | ecpg_using { $$ = $1; }
- ;
+opt_ecpg_using: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | ecpg_using
+ {
+ $$ = $1;
+ }
+ ;
-ecpg_using: USING using_list { $$ = EMPTY; }
- | using_descriptor { $$ = $1; }
- ;
+ecpg_using: USING using_list
+ {
+ $$ = EMPTY;
+ }
+ | using_descriptor
+ {
+ $$ = $1;
+ }
+ ;
using_descriptor: USING SQL_P SQL_DESCRIPTOR quoted_ident_stringvar
- {
- add_variable_to_head(&argsinsert, descriptor_variable($4,0), &no_indicator);
- $$ = EMPTY;
- }
- | USING SQL_DESCRIPTOR name
- {
- add_variable_to_head(&argsinsert, sqlda_variable($3), &no_indicator);
- $$ = EMPTY;
- }
- ;
+ {
+ add_variable_to_head(&argsinsert, descriptor_variable($4, 0), &no_indicator);
+ $$ = EMPTY;
+ }
+ | USING SQL_DESCRIPTOR name
+ {
+ add_variable_to_head(&argsinsert, sqlda_variable($3), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
into_descriptor: INTO SQL_P SQL_DESCRIPTOR quoted_ident_stringvar
- {
- add_variable_to_head(&argsresult, descriptor_variable($4,1), &no_indicator);
- $$ = EMPTY;
- }
- | INTO SQL_DESCRIPTOR name
- {
- add_variable_to_head(&argsresult, sqlda_variable($3), &no_indicator);
- $$ = EMPTY;
- }
- ;
+ {
+ add_variable_to_head(&argsresult, descriptor_variable($4, 1), &no_indicator);
+ $$ = EMPTY;
+ }
+ | INTO SQL_DESCRIPTOR name
+ {
+ add_variable_to_head(&argsresult, sqlda_variable($3), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
into_sqlda: INTO name
- {
- add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
- $$ = EMPTY;
- }
- ;
+ {
+ add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
-using_list: UsingValue | UsingValue ',' using_list;
+using_list: UsingValue | UsingValue ',' using_list
+ ;
UsingValue: UsingConst
- {
- char *length = mm_alloc(32);
+ {
+ char *length = mm_alloc(32);
- sprintf(length, "%zu", strlen($1));
- add_variable_to_head(&argsinsert, new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
- }
- | civar { $$ = EMPTY; }
- | civarind { $$ = EMPTY; }
- ;
-
-UsingConst: Iconst { $$ = $1; }
- | '+' Iconst { $$ = cat_str(2, mm_strdup("+"), $2); }
- | '-' Iconst { $$ = cat_str(2, mm_strdup("-"), $2); }
- | ecpg_fconst { $$ = $1; }
- | '+' ecpg_fconst { $$ = cat_str(2, mm_strdup("+"), $2); }
- | '-' ecpg_fconst { $$ = cat_str(2, mm_strdup("-"), $2); }
- | ecpg_sconst { $$ = $1; }
- | ecpg_bconst { $$ = $1; }
- | ecpg_xconst { $$ = $1; }
- ;
+ sprintf(length, "%zu", strlen($1));
+ add_variable_to_head(&argsinsert, new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
+ }
+ | civar
+ {
+ $$ = EMPTY;
+ }
+ | civarind
+ {
+ $$ = EMPTY;
+ }
+ ;
+
+UsingConst: Iconst
+ {
+ $$ = $1;
+ }
+ | '+' Iconst
+ {
+ $$ = cat_str(2, mm_strdup("+"), $2);
+ }
+ | '-' Iconst
+ {
+ $$ = cat_str(2, mm_strdup("-"), $2);
+ }
+ | ecpg_fconst
+ {
+ $$ = $1;
+ }
+ | '+' ecpg_fconst
+ {
+ $$ = cat_str(2, mm_strdup("+"), $2);
+ }
+ | '-' ecpg_fconst
+ {
+ $$ = cat_str(2, mm_strdup("-"), $2);
+ }
+ | ecpg_sconst
+ {
+ $$ = $1;
+ }
+ | ecpg_bconst
+ {
+ $$ = $1;
+ }
+ | ecpg_xconst
+ {
+ $$ = $1;
+ }
+ ;
/*
* We accept DESCRIBE [OUTPUT] but do nothing with DESCRIBE INPUT so far.
@@ -1223,6 +1503,7 @@ ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor
| SQL_DESCRIBE opt_output prepared_name using_descriptor
{
struct variable *var;
+
var = argsinsert->variable;
remove_variable_from_list(&argsinsert, var);
add_variable_to_head(&argsresult, var, &no_indicator);
@@ -1247,8 +1528,14 @@ ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor
}
;
-opt_output: SQL_OUTPUT { $$ = mm_strdup("output"); }
- | /* EMPTY */ { $$ = EMPTY; }
+opt_output: SQL_OUTPUT
+ {
+ $$ = mm_strdup("output");
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
;
/*
@@ -1261,425 +1548,465 @@ opt_output: SQL_OUTPUT { $$ = mm_strdup("output"); }
* allocate a descriptor
*/
ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
- {
- add_descriptor($3,connection);
- $$ = $3;
- }
- ;
+ {
+ add_descriptor($3, connection);
+ $$ = $3;
+ }
+ ;
/*
* deallocate a descriptor
*/
-ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
- {
- drop_descriptor($3,connection);
- $$ = $3;
- }
- ;
+ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
+ {
+ drop_descriptor($3, connection);
+ $$ = $3;
+ }
+ ;
/*
* manipulate a descriptor header
*/
ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItems
- { $$ = $3; }
- ;
+ {
+ $$ = $3;
+ }
+ ;
ECPGGetDescHeaderItems: ECPGGetDescHeaderItem
- | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem
- ;
+ | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem
+ ;
ECPGGetDescHeaderItem: cvariable '=' desc_header_item
- { push_assignment($1, $3); }
- ;
-
+ {
+ push_assignment($1, $3);
+ }
+ ;
ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItems
- { $$ = $3; }
- ;
+ {
+ $$ = $3;
+ }
+ ;
ECPGSetDescHeaderItems: ECPGSetDescHeaderItem
- | ECPGSetDescHeaderItems ',' ECPGSetDescHeaderItem
- ;
+ | ECPGSetDescHeaderItems ',' ECPGSetDescHeaderItem
+ ;
ECPGSetDescHeaderItem: desc_header_item '=' IntConstVar
- {
- push_assignment($3, $1);
- }
- ;
+ {
+ push_assignment($3, $1);
+ }
+ ;
IntConstVar: Iconst
- {
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- sprintf(length, "%zu", strlen($1));
- new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
- $$ = $1;
- }
- | cvariable
- {
- $$ = $1;
- }
- ;
+ sprintf(length, "%zu", strlen($1));
+ new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = $1;
+ }
+ | cvariable
+ {
+ $$ = $1;
+ }
+ ;
-desc_header_item: SQL_COUNT { $$ = ECPGd_count; }
- ;
+desc_header_item: SQL_COUNT
+ {
+ $$ = ECPGd_count;
+ }
+ ;
/*
* manipulate a descriptor
*/
-ECPGGetDescriptor: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGGetDescItems
- { $$.str = $5; $$.name = $3; }
- ;
+ECPGGetDescriptor: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGGetDescItems
+ {
+ $$.str = $5;
+ $$.name = $3;
+ }
+ ;
ECPGGetDescItems: ECPGGetDescItem
- | ECPGGetDescItems ',' ECPGGetDescItem
- ;
-
-ECPGGetDescItem: cvariable '=' descriptor_item { push_assignment($1, $3); };
+ | ECPGGetDescItems ',' ECPGGetDescItem
+ ;
+ECPGGetDescItem: cvariable '=' descriptor_item
+ {
+ push_assignment($1, $3);
+ }
+ ;
-ECPGSetDescriptor: SET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGSetDescItems
- { $$.str = $5; $$.name = $3; }
- ;
+ECPGSetDescriptor: SET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGSetDescItems
+ {
+ $$.str = $5;
+ $$.name = $3;
+ }
+ ;
ECPGSetDescItems: ECPGSetDescItem
- | ECPGSetDescItems ',' ECPGSetDescItem
- ;
+ | ECPGSetDescItems ',' ECPGSetDescItem
+ ;
ECPGSetDescItem: descriptor_item '=' AllConstVar
- {
- push_assignment($3, $1);
- }
- ;
+ {
+ push_assignment($3, $1);
+ }
+ ;
AllConstVar: ecpg_fconst
- {
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
-
- sprintf(length, "%zu", strlen($1));
- new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
- $$ = $1;
- }
-
- | IntConstVar
- {
- $$ = $1;
- }
-
- | '-' ecpg_fconst
- {
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- char *var = cat2_str(mm_strdup("-"), $2);
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- sprintf(length, "%zu", strlen(var));
- new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
- $$ = var;
- }
+ sprintf(length, "%zu", strlen($1));
+ new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = $1;
+ }
+ | IntConstVar
+ {
+ $$ = $1;
+ }
+ | '-' ecpg_fconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *var = cat2_str(mm_strdup("-"), $2);
- | '-' Iconst
- {
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- char *var = cat2_str(mm_strdup("-"), $2);
+ sprintf(length, "%zu", strlen(var));
+ new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = var;
+ }
+ | '-' Iconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *var = cat2_str(mm_strdup("-"), $2);
- sprintf(length, "%zu", strlen(var));
- new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
- $$ = var;
- }
+ sprintf(length, "%zu", strlen(var));
+ new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = var;
+ }
+ | ecpg_sconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *var = $1 + 1;
- | ecpg_sconst
- {
- char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
- char *var = $1 + 1;
+ var[strlen(var) - 1] = '\0';
+ sprintf(length, "%zu", strlen(var));
+ new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = var;
+ }
+ ;
- var[strlen(var) - 1] = '\0';
- sprintf(length, "%zu", strlen(var));
- new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
- $$ = var;
- }
- ;
-
-descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
- | DATA_P { $$ = ECPGd_data; }
- | SQL_DATETIME_INTERVAL_CODE { $$ = ECPGd_di_code; }
- | SQL_DATETIME_INTERVAL_PRECISION { $$ = ECPGd_di_precision; }
- | SQL_INDICATOR { $$ = ECPGd_indicator; }
- | SQL_KEY_MEMBER { $$ = ECPGd_key_member; }
- | SQL_LENGTH { $$ = ECPGd_length; }
- | NAME_P { $$ = ECPGd_name; }
- | SQL_NULLABLE { $$ = ECPGd_nullable; }
- | SQL_OCTET_LENGTH { $$ = ECPGd_octet; }
- | PRECISION { $$ = ECPGd_precision; }
- | SQL_RETURNED_LENGTH { $$ = ECPGd_length; }
- | SQL_RETURNED_OCTET_LENGTH { $$ = ECPGd_ret_octet; }
- | SQL_SCALE { $$ = ECPGd_scale; }
- | TYPE_P { $$ = ECPGd_type; }
- ;
+descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
+ | DATA_P { $$ = ECPGd_data; }
+ | SQL_DATETIME_INTERVAL_CODE { $$ = ECPGd_di_code; }
+ | SQL_DATETIME_INTERVAL_PRECISION { $$ = ECPGd_di_precision; }
+ | SQL_INDICATOR { $$ = ECPGd_indicator; }
+ | SQL_KEY_MEMBER { $$ = ECPGd_key_member; }
+ | SQL_LENGTH { $$ = ECPGd_length; }
+ | NAME_P { $$ = ECPGd_name; }
+ | SQL_NULLABLE { $$ = ECPGd_nullable; }
+ | SQL_OCTET_LENGTH { $$ = ECPGd_octet; }
+ | PRECISION { $$ = ECPGd_precision; }
+ | SQL_RETURNED_LENGTH { $$ = ECPGd_length; }
+ | SQL_RETURNED_OCTET_LENGTH { $$ = ECPGd_ret_octet; }
+ | SQL_SCALE { $$ = ECPGd_scale; }
+ | TYPE_P { $$ = ECPGd_type; }
+ ;
/*
* set/reset the automatic transaction mode, this needs a different handling
* as the other set commands
*/
-ECPGSetAutocommit: SET SQL_AUTOCOMMIT '=' on_off { $$ = $4; }
- | SET SQL_AUTOCOMMIT TO on_off { $$ = $4; }
- ;
+ECPGSetAutocommit: SET SQL_AUTOCOMMIT '=' on_off
+ {
+ $$ = $4;
+ }
+ | SET SQL_AUTOCOMMIT TO on_off
+ {
+ $$ = $4;
+ }
+ ;
-on_off: ON { $$ = mm_strdup("on"); }
- | OFF { $$ = mm_strdup("off"); }
- ;
+on_off: ON
+ {
+ $$ = mm_strdup("on");
+ }
+ | OFF
+ {
+ $$ = mm_strdup("off");
+ }
+ ;
/*
* set the actual connection, this needs a different handling as the other
* set commands
*/
-ECPGSetConnection: SET CONNECTION TO connection_object { $$ = $4; }
- | SET CONNECTION '=' connection_object { $$ = $4; }
- | SET CONNECTION connection_object { $$ = $3; }
- ;
+ECPGSetConnection: SET CONNECTION TO connection_object
+ {
+ $$ = $4;
+ }
+ | SET CONNECTION '=' connection_object
+ {
+ $$ = $4;
+ }
+ | SET CONNECTION connection_object
+ {
+ $$ = $3;
+ }
+ ;
/*
* define a new type for embedded SQL
*/
ECPGTypedef: TYPE_P
- {
- /* reset this variable so we see if there was */
- /* an initializer specified */
- initializer = 0;
- }
- ECPGColLabel IS var_type opt_array_bounds opt_reference
- {
- add_typedef($3, $6.index1, $6.index2, $5.type_enum, $5.type_dimension, $5.type_index, initializer, *$7 ? 1 : 0);
+ {
+ /* reset this variable so we see if there was */
+ /* an initializer specified */
+ initializer = 0;
+ }
+ ECPGColLabel IS var_type opt_array_bounds opt_reference
+ {
+ add_typedef($3, $6.index1, $6.index2, $5.type_enum, $5.type_dimension, $5.type_index, initializer, *$7 ? 1 : 0);
- if (auto_create_c == false)
- $$ = cat_str(7, mm_strdup("/* exec sql type"), mm_strdup($3), mm_strdup("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, mm_strdup("*/"));
- else
- $$ = cat_str(6, mm_strdup("typedef "), mm_strdup($5.type_str), *$7?mm_strdup("*"):mm_strdup(""), mm_strdup($3), mm_strdup($6.str), mm_strdup(";"));
- }
- ;
+ if (auto_create_c == false)
+ $$ = cat_str(7, mm_strdup("/* exec sql type"), mm_strdup($3), mm_strdup("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, mm_strdup("*/"));
+ else
+ $$ = cat_str(6, mm_strdup("typedef "), mm_strdup($5.type_str), *$7 ? mm_strdup("*") : mm_strdup(""), mm_strdup($3), mm_strdup($6.str), mm_strdup(";"));
+ }
+ ;
-opt_reference: SQL_REFERENCE { $$ = mm_strdup("reference"); }
- | /*EMPTY*/ { $$ = EMPTY; }
- ;
+opt_reference: SQL_REFERENCE
+ {
+ $$ = mm_strdup("reference");
+ }
+ | /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ ;
/*
* define the type of one variable for embedded SQL
*/
ECPGVar: SQL_VAR
+ {
+ /* reset this variable so we see if there was */
+ /* an initializer specified */
+ initializer = 0;
+ }
+ ColLabel IS var_type opt_array_bounds opt_reference
+ {
+ struct variable *p = find_variable($3);
+ char *dimension = $6.index1;
+ char *length = $6.index2;
+ struct ECPGtype *type;
+
+ if (($5.type_enum == ECPGt_struct ||
+ $5.type_enum == ECPGt_union) &&
+ initializer == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "initializer not allowed in EXEC SQL VAR command");
+ else
{
- /* reset this variable so we see if there was */
- /* an initializer specified */
- initializer = 0;
- }
- ColLabel IS var_type opt_array_bounds opt_reference
- {
- struct variable *p = find_variable($3);
- char *dimension = $6.index1;
- char *length = $6.index2;
- struct ECPGtype * type;
-
- if (($5.type_enum == ECPGt_struct ||
- $5.type_enum == ECPGt_union) &&
- initializer == 1)
- mmerror(PARSE_ERROR, ET_ERROR, "initializer not allowed in EXEC SQL VAR command");
- else
- {
- adjust_array($5.type_enum, &dimension, &length, $5.type_dimension, $5.type_index, *$7?1:0, false);
+ adjust_array($5.type_enum, &dimension, &length, $5.type_dimension, $5.type_index, *$7 ? 1 : 0, false);
- switch ($5.type_enum)
- {
+ switch ($5.type_enum)
+ {
case ECPGt_struct:
case ECPGt_union:
- if (atoi(dimension) < 0)
- type = ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof);
- else
- type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof), dimension);
- break;
+ if (atoi(dimension) < 0)
+ type = ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof);
+ else
+ type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof), dimension);
+ break;
case ECPGt_varchar:
case ECPGt_bytea:
- if (atoi(dimension) == -1)
- type = ECPGmake_simple_type($5.type_enum, length, 0);
- else
- type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
- break;
+ if (atoi(dimension) == -1)
+ type = ECPGmake_simple_type($5.type_enum, length, 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
+ break;
case ECPGt_char:
case ECPGt_unsigned_char:
case ECPGt_string:
- if (atoi(dimension) == -1)
- type = ECPGmake_simple_type($5.type_enum, length, 0);
- else
- type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
- break;
+ if (atoi(dimension) == -1)
+ type = ECPGmake_simple_type($5.type_enum, length, 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
+ break;
default:
- if (atoi(length) >= 0)
- mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
-
- if (atoi(dimension) < 0)
- type = ECPGmake_simple_type($5.type_enum, mm_strdup("1"), 0);
- else
- type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, mm_strdup("1"), 0), dimension);
- break;
- }
+ if (atoi(length) >= 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
- ECPGfree_type(p->type);
- p->type = type;
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type($5.type_enum, mm_strdup("1"), 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, mm_strdup("1"), 0), dimension);
+ break;
}
- $$ = cat_str(7, mm_strdup("/* exec sql var"), mm_strdup($3), mm_strdup("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, mm_strdup("*/"));
+ ECPGfree_type(p->type);
+ p->type = type;
}
- ;
+
+ $$ = cat_str(7, mm_strdup("/* exec sql var"), mm_strdup($3), mm_strdup("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, mm_strdup("*/"));
+ }
+ ;
/*
* whenever statement: decide what to do in case of error/no data found
* according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
*/
ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action
- {
- when_error.code = $<action>3.code;
- when_error.command = $<action>3.command;
- $$ = cat_str(3, mm_strdup("/* exec sql whenever sqlerror "), $3.str, mm_strdup("; */"));
- }
- | SQL_WHENEVER NOT SQL_FOUND action
- {
- when_nf.code = $<action>4.code;
- when_nf.command = $<action>4.command;
- $$ = cat_str(3, mm_strdup("/* exec sql whenever not found "), $4.str, mm_strdup("; */"));
- }
- | SQL_WHENEVER SQL_SQLWARNING action
- {
- when_warn.code = $<action>3.code;
- when_warn.command = $<action>3.command;
- $$ = cat_str(3, mm_strdup("/* exec sql whenever sql_warning "), $3.str, mm_strdup("; */"));
- }
- ;
+ {
+ when_error.code = $<action>3.code;
+ when_error.command = $<action>3.command;
+ $$ = cat_str(3, mm_strdup("/* exec sql whenever sqlerror "), $3.str, mm_strdup("; */"));
+ }
+ | SQL_WHENEVER NOT SQL_FOUND action
+ {
+ when_nf.code = $<action>4.code;
+ when_nf.command = $<action>4.command;
+ $$ = cat_str(3, mm_strdup("/* exec sql whenever not found "), $4.str, mm_strdup("; */"));
+ }
+ | SQL_WHENEVER SQL_SQLWARNING action
+ {
+ when_warn.code = $<action>3.code;
+ when_warn.command = $<action>3.command;
+ $$ = cat_str(3, mm_strdup("/* exec sql whenever sql_warning "), $3.str, mm_strdup("; */"));
+ }
+ ;
-action : CONTINUE_P
- {
- $<action>$.code = W_NOTHING;
- $<action>$.command = NULL;
- $<action>$.str = mm_strdup("continue");
- }
- | SQL_SQLPRINT
- {
- $<action>$.code = W_SQLPRINT;
- $<action>$.command = NULL;
- $<action>$.str = mm_strdup("sqlprint");
- }
- | SQL_STOP
- {
- $<action>$.code = W_STOP;
- $<action>$.command = NULL;
- $<action>$.str = mm_strdup("stop");
- }
- | SQL_GOTO name
- {
- $<action>$.code = W_GOTO;
- $<action>$.command = mm_strdup($2);
- $<action>$.str = cat2_str(mm_strdup("goto "), $2);
- }
- | SQL_GO TO name
- {
- $<action>$.code = W_GOTO;
- $<action>$.command = mm_strdup($3);
- $<action>$.str = cat2_str(mm_strdup("goto "), $3);
- }
- | DO name '(' c_args ')'
- {
- $<action>$.code = W_DO;
- $<action>$.command = cat_str(4, $2, mm_strdup("("), $4, mm_strdup(")"));
- $<action>$.str = cat2_str(mm_strdup("do"), mm_strdup($<action>$.command));
- }
- | DO SQL_BREAK
- {
- $<action>$.code = W_BREAK;
- $<action>$.command = NULL;
- $<action>$.str = mm_strdup("break");
- }
- | DO CONTINUE_P
- {
- $<action>$.code = W_CONTINUE;
- $<action>$.command = NULL;
- $<action>$.str = mm_strdup("continue");
- }
- | CALL name '(' c_args ')'
- {
- $<action>$.code = W_DO;
- $<action>$.command = cat_str(4, $2, mm_strdup("("), $4, mm_strdup(")"));
- $<action>$.str = cat2_str(mm_strdup("call"), mm_strdup($<action>$.command));
- }
- | CALL name
- {
- $<action>$.code = W_DO;
- $<action>$.command = cat2_str($2, mm_strdup("()"));
- $<action>$.str = cat2_str(mm_strdup("call"), mm_strdup($<action>$.command));
- }
- ;
+action: CONTINUE_P
+ {
+ $<action>$.code = W_NOTHING;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("continue");
+ }
+ | SQL_SQLPRINT
+ {
+ $<action>$.code = W_SQLPRINT;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("sqlprint");
+ }
+ | SQL_STOP
+ {
+ $<action>$.code = W_STOP;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("stop");
+ }
+ | SQL_GOTO name
+ {
+ $<action>$.code = W_GOTO;
+ $<action>$.command = mm_strdup($2);
+ $<action>$.str = cat2_str(mm_strdup("goto "), $2);
+ }
+ | SQL_GO TO name
+ {
+ $<action>$.code = W_GOTO;
+ $<action>$.command = mm_strdup($3);
+ $<action>$.str = cat2_str(mm_strdup("goto "), $3);
+ }
+ | DO name '(' c_args ')'
+ {
+ $<action>$.code = W_DO;
+ $<action>$.command = cat_str(4, $2, mm_strdup("("), $4, mm_strdup(")"));
+ $<action>$.str = cat2_str(mm_strdup("do"), mm_strdup($<action>$.command));
+ }
+ | DO SQL_BREAK
+ {
+ $<action>$.code = W_BREAK;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("break");
+ }
+ | DO CONTINUE_P
+ {
+ $<action>$.code = W_CONTINUE;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("continue");
+ }
+ | CALL name '(' c_args ')'
+ {
+ $<action>$.code = W_DO;
+ $<action>$.command = cat_str(4, $2, mm_strdup("("), $4, mm_strdup(")"));
+ $<action>$.str = cat2_str(mm_strdup("call"), mm_strdup($<action>$.command));
+ }
+ | CALL name
+ {
+ $<action>$.code = W_DO;
+ $<action>$.command = cat2_str($2, mm_strdup("()"));
+ $<action>$.str = cat2_str(mm_strdup("call"), mm_strdup($<action>$.command));
+ }
+ ;
/* some other stuff for ecpg */
/* additional unreserved keywords */
-ECPGKeywords: ECPGKeywords_vanames { $$ = $1; }
- | ECPGKeywords_rest { $$ = $1; }
- ;
-
-ECPGKeywords_vanames: SQL_BREAK { $$ = mm_strdup("break"); }
- | SQL_CARDINALITY { $$ = mm_strdup("cardinality"); }
- | SQL_COUNT { $$ = mm_strdup("count"); }
- | SQL_DATETIME_INTERVAL_CODE { $$ = mm_strdup("datetime_interval_code"); }
- | SQL_DATETIME_INTERVAL_PRECISION { $$ = mm_strdup("datetime_interval_precision"); }
- | SQL_FOUND { $$ = mm_strdup("found"); }
- | SQL_GO { $$ = mm_strdup("go"); }
- | SQL_GOTO { $$ = mm_strdup("goto"); }
- | SQL_IDENTIFIED { $$ = mm_strdup("identified"); }
- | SQL_INDICATOR { $$ = mm_strdup("indicator"); }
- | SQL_KEY_MEMBER { $$ = mm_strdup("key_member"); }
- | SQL_LENGTH { $$ = mm_strdup("length"); }
- | SQL_NULLABLE { $$ = mm_strdup("nullable"); }
- | SQL_OCTET_LENGTH { $$ = mm_strdup("octet_length"); }
- | SQL_RETURNED_LENGTH { $$ = mm_strdup("returned_length"); }
- | SQL_RETURNED_OCTET_LENGTH { $$ = mm_strdup("returned_octet_length"); }
- | SQL_SCALE { $$ = mm_strdup("scale"); }
- | SQL_SECTION { $$ = mm_strdup("section"); }
- | SQL_SQLERROR { $$ = mm_strdup("sqlerror"); }
- | SQL_SQLPRINT { $$ = mm_strdup("sqlprint"); }
- | SQL_SQLWARNING { $$ = mm_strdup("sqlwarning"); }
- | SQL_STOP { $$ = mm_strdup("stop"); }
- ;
-
-ECPGKeywords_rest: SQL_CONNECT { $$ = mm_strdup("connect"); }
- | SQL_DESCRIBE { $$ = mm_strdup("describe"); }
- | SQL_DISCONNECT { $$ = mm_strdup("disconnect"); }
- | SQL_OPEN { $$ = mm_strdup("open"); }
- | SQL_VAR { $$ = mm_strdup("var"); }
- | SQL_WHENEVER { $$ = mm_strdup("whenever"); }
- ;
+ECPGKeywords: ECPGKeywords_vanames { $$ = $1; }
+ | ECPGKeywords_rest { $$ = $1; }
+ ;
+
+ECPGKeywords_vanames: SQL_BREAK { $$ = mm_strdup("break"); }
+ | SQL_CARDINALITY { $$ = mm_strdup("cardinality"); }
+ | SQL_COUNT { $$ = mm_strdup("count"); }
+ | SQL_DATETIME_INTERVAL_CODE { $$ = mm_strdup("datetime_interval_code"); }
+ | SQL_DATETIME_INTERVAL_PRECISION { $$ = mm_strdup("datetime_interval_precision"); }
+ | SQL_FOUND { $$ = mm_strdup("found"); }
+ | SQL_GO { $$ = mm_strdup("go"); }
+ | SQL_GOTO { $$ = mm_strdup("goto"); }
+ | SQL_IDENTIFIED { $$ = mm_strdup("identified"); }
+ | SQL_INDICATOR { $$ = mm_strdup("indicator"); }
+ | SQL_KEY_MEMBER { $$ = mm_strdup("key_member"); }
+ | SQL_LENGTH { $$ = mm_strdup("length"); }
+ | SQL_NULLABLE { $$ = mm_strdup("nullable"); }
+ | SQL_OCTET_LENGTH { $$ = mm_strdup("octet_length"); }
+ | SQL_RETURNED_LENGTH { $$ = mm_strdup("returned_length"); }
+ | SQL_RETURNED_OCTET_LENGTH { $$ = mm_strdup("returned_octet_length"); }
+ | SQL_SCALE { $$ = mm_strdup("scale"); }
+ | SQL_SECTION { $$ = mm_strdup("section"); }
+ | SQL_SQLERROR { $$ = mm_strdup("sqlerror"); }
+ | SQL_SQLPRINT { $$ = mm_strdup("sqlprint"); }
+ | SQL_SQLWARNING { $$ = mm_strdup("sqlwarning"); }
+ | SQL_STOP { $$ = mm_strdup("stop"); }
+ ;
+
+ECPGKeywords_rest: SQL_CONNECT { $$ = mm_strdup("connect"); }
+ | SQL_DESCRIBE { $$ = mm_strdup("describe"); }
+ | SQL_DISCONNECT { $$ = mm_strdup("disconnect"); }
+ | SQL_OPEN { $$ = mm_strdup("open"); }
+ | SQL_VAR { $$ = mm_strdup("var"); }
+ | SQL_WHENEVER { $$ = mm_strdup("whenever"); }
+ ;
/* additional keywords that can be SQL type names (but not ECPGColLabels) */
-ECPGTypeName: SQL_BOOL { $$ = mm_strdup("bool"); }
- | SQL_LONG { $$ = mm_strdup("long"); }
- | SQL_OUTPUT { $$ = mm_strdup("output"); }
- | SQL_SHORT { $$ = mm_strdup("short"); }
- | SQL_STRUCT { $$ = mm_strdup("struct"); }
- | SQL_SIGNED { $$ = mm_strdup("signed"); }
- | SQL_UNSIGNED { $$ = mm_strdup("unsigned"); }
- ;
-
-symbol: ColLabel { $$ = $1; }
- ;
-
-ECPGColId: ecpg_ident { $$ = $1; }
- | unreserved_keyword { $$ = $1; }
- | col_name_keyword { $$ = $1; }
- | ECPGunreserved_interval { $$ = $1; }
- | ECPGKeywords { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
- | CHAR_P { $$ = mm_strdup("char"); }
- | VALUES { $$ = mm_strdup("values"); }
- ;
+ECPGTypeName: SQL_BOOL { $$ = mm_strdup("bool"); }
+ | SQL_LONG { $$ = mm_strdup("long"); }
+ | SQL_OUTPUT { $$ = mm_strdup("output"); }
+ | SQL_SHORT { $$ = mm_strdup("short"); }
+ | SQL_STRUCT { $$ = mm_strdup("struct"); }
+ | SQL_SIGNED { $$ = mm_strdup("signed"); }
+ | SQL_UNSIGNED { $$ = mm_strdup("unsigned"); }
+ ;
+
+symbol: ColLabel { $$ = $1; }
+ ;
+
+ECPGColId: ecpg_ident { $$ = $1; }
+ | unreserved_keyword { $$ = $1; }
+ | col_name_keyword { $$ = $1; }
+ | ECPGunreserved_interval { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | VALUES { $$ = mm_strdup("values"); }
+ ;
/*
* Name classification hierarchy.
@@ -1691,59 +2018,59 @@ ECPGColId: ecpg_ident { $$ = $1; }
/* Column identifier --- names that can be column, table, etc names.
*/
-ColId: ecpg_ident { $$ = $1; }
- | all_unreserved_keyword { $$ = $1; }
- | col_name_keyword { $$ = $1; }
- | ECPGKeywords { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
- | CHAR_P { $$ = mm_strdup("char"); }
- | VALUES { $$ = mm_strdup("values"); }
- ;
+ColId: ecpg_ident { $$ = $1; }
+ | all_unreserved_keyword { $$ = $1; }
+ | col_name_keyword { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | VALUES { $$ = mm_strdup("values"); }
+ ;
/* Type/function identifier --- names that can be type or function names.
*/
-type_function_name: ecpg_ident { $$ = $1; }
- | all_unreserved_keyword { $$ = $1; }
- | type_func_name_keyword { $$ = $1; }
- | ECPGKeywords { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
- | ECPGTypeName { $$ = $1; }
- ;
+type_function_name: ecpg_ident { $$ = $1; }
+ | all_unreserved_keyword { $$ = $1; }
+ | type_func_name_keyword { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | ECPGTypeName { $$ = $1; }
+ ;
/* Column label --- allowed labels in "AS" clauses.
* This presently includes *all* Postgres keywords.
*/
-ColLabel: ECPGColLabel { $$ = $1; }
- | ECPGTypeName { $$ = $1; }
- | CHAR_P { $$ = mm_strdup("char"); }
- | CURRENT_P { $$ = mm_strdup("current"); }
- | INPUT_P { $$ = mm_strdup("input"); }
- | INT_P { $$ = mm_strdup("int"); }
- | TO { $$ = mm_strdup("to"); }
- | UNION { $$ = mm_strdup("union"); }
- | VALUES { $$ = mm_strdup("values"); }
- | ECPGCKeywords { $$ = $1; }
- | ECPGunreserved_interval { $$ = $1; }
- ;
-
-ECPGColLabel: ecpg_ident { $$ = $1; }
- | unreserved_keyword { $$ = $1; }
- | col_name_keyword { $$ = $1; }
- | type_func_name_keyword { $$ = $1; }
- | reserved_keyword { $$ = $1; }
- | ECPGKeywords_vanames { $$ = $1; }
- | ECPGKeywords_rest { $$ = $1; }
- | CONNECTION { $$ = mm_strdup("connection"); }
- ;
-
-ECPGCKeywords: S_AUTO { $$ = mm_strdup("auto"); }
- | S_CONST { $$ = mm_strdup("const"); }
- | S_EXTERN { $$ = mm_strdup("extern"); }
- | S_REGISTER { $$ = mm_strdup("register"); }
- | S_STATIC { $$ = mm_strdup("static"); }
- | S_TYPEDEF { $$ = mm_strdup("typedef"); }
- | S_VOLATILE { $$ = mm_strdup("volatile"); }
- ;
+ColLabel: ECPGColLabel { $$ = $1; }
+ | ECPGTypeName { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | CURRENT_P { $$ = mm_strdup("current"); }
+ | INPUT_P { $$ = mm_strdup("input"); }
+ | INT_P { $$ = mm_strdup("int"); }
+ | TO { $$ = mm_strdup("to"); }
+ | UNION { $$ = mm_strdup("union"); }
+ | VALUES { $$ = mm_strdup("values"); }
+ | ECPGCKeywords { $$ = $1; }
+ | ECPGunreserved_interval { $$ = $1; }
+ ;
+
+ECPGColLabel: ecpg_ident { $$ = $1; }
+ | unreserved_keyword { $$ = $1; }
+ | col_name_keyword { $$ = $1; }
+ | type_func_name_keyword { $$ = $1; }
+ | reserved_keyword { $$ = $1; }
+ | ECPGKeywords_vanames { $$ = $1; }
+ | ECPGKeywords_rest { $$ = $1; }
+ | CONNECTION { $$ = mm_strdup("connection"); }
+ ;
+
+ECPGCKeywords: S_AUTO { $$ = mm_strdup("auto"); }
+ | S_CONST { $$ = mm_strdup("const"); }
+ | S_EXTERN { $$ = mm_strdup("extern"); }
+ | S_REGISTER { $$ = mm_strdup("register"); }
+ | S_STATIC { $$ = mm_strdup("static"); }
+ | S_TYPEDEF { $$ = mm_strdup("typedef"); }
+ | S_VOLATILE { $$ = mm_strdup("volatile"); }
+ ;
/* "Unreserved" keywords --- available for use as any kind of name.
*/
@@ -1760,250 +2087,402 @@ ECPGCKeywords: S_AUTO { $$ = mm_strdup("auto"); }
* The mentioned exclusions are done by $replace_line settings in parse.pl.
*/
all_unreserved_keyword: unreserved_keyword { $$ = $1; }
- | ECPGunreserved_interval { $$ = $1; }
- | CONNECTION { $$ = mm_strdup("connection"); }
- ;
-
-ECPGunreserved_interval: DAY_P { $$ = mm_strdup("day"); }
- | HOUR_P { $$ = mm_strdup("hour"); }
- | MINUTE_P { $$ = mm_strdup("minute"); }
- | MONTH_P { $$ = mm_strdup("month"); }
- | SECOND_P { $$ = mm_strdup("second"); }
- | YEAR_P { $$ = mm_strdup("year"); }
- ;
+ | ECPGunreserved_interval { $$ = $1; }
+ | CONNECTION { $$ = mm_strdup("connection"); }
+ ;
+ECPGunreserved_interval: DAY_P { $$ = mm_strdup("day"); }
+ | HOUR_P { $$ = mm_strdup("hour"); }
+ | MINUTE_P { $$ = mm_strdup("minute"); }
+ | MONTH_P { $$ = mm_strdup("month"); }
+ | SECOND_P { $$ = mm_strdup("second"); }
+ | YEAR_P { $$ = mm_strdup("year"); }
+ ;
-into_list : coutputvariable | into_list ',' coutputvariable
- ;
+into_list: coutputvariable | into_list ',' coutputvariable
+ ;
-ecpgstart: SQL_START {
- reset_variables();
- pacounter = 1;
- }
- ;
+ecpgstart: SQL_START
+ {
+ reset_variables();
+ pacounter = 1;
+ }
+ ;
-c_args: /*EMPTY*/ { $$ = EMPTY; }
- | c_list { $$ = $1; }
- ;
+c_args: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | c_list
+ {
+ $$ = $1;
+ }
+ ;
coutputvariable: cvariable indicator
- { add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); }
- | cvariable
- { add_variable_to_head(&argsresult, find_variable($1), &no_indicator); }
- ;
+ {
+ add_variable_to_head(&argsresult, find_variable($1), find_variable($2));
+ }
+ | cvariable
+ {
+ add_variable_to_head(&argsresult, find_variable($1), &no_indicator);
+ }
+ ;
civarind: cvariable indicator
- {
- if (find_variable($2)->type->type == ECPGt_array)
- mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
+ {
+ if (find_variable($2)->type->type == ECPGt_array)
+ mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
- add_variable_to_head(&argsinsert, find_variable($1), find_variable($2));
- $$ = create_questionmarks($1, false);
- }
- ;
+ add_variable_to_head(&argsinsert, find_variable($1), find_variable($2));
+ $$ = create_questionmarks($1, false);
+ }
+ ;
char_civar: char_variable
- {
- char *ptr = strstr($1, ".arr");
+ {
+ char *ptr = strstr($1, ".arr");
- if (ptr) /* varchar, we need the struct name here, not the struct element */
- *ptr = '\0';
- add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
- $$ = $1;
- }
- ;
+ if (ptr) /* varchar, we need the struct name here, not
+ * the struct element */
+ *ptr = '\0';
+ add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
+ $$ = $1;
+ }
+ ;
civar: cvariable
- {
- add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
- $$ = create_questionmarks($1, false);
- }
- ;
+ {
+ add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
+ $$ = create_questionmarks($1, false);
+ }
+ ;
-indicator: cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
- | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
- | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
- ;
+indicator: cvariable
+ {
+ check_indicator((find_variable($1))->type);
+ $$ = $1;
+ }
+ | SQL_INDICATOR cvariable
+ {
+ check_indicator((find_variable($2))->type);
+ $$ = $2;
+ }
+ | SQL_INDICATOR name
+ {
+ check_indicator((find_variable($2))->type);
+ $$ = $2;
+ }
+ ;
-cvariable: CVARIABLE
- {
- /* As long as multidimensional arrays are not implemented we have to check for those here */
- char *ptr = $1;
- int brace_open=0, brace = false;
+cvariable: CVARIABLE
+ {
+ /*
+ * As long as multidimensional arrays are not implemented we have to
+ * check for those here
+ */
+ char *ptr = $1;
+ int brace_open = 0,
+ brace = false;
- for (; *ptr; ptr++)
+ for (; *ptr; ptr++)
+ {
+ switch (*ptr)
{
- switch (*ptr)
- {
- case '[':
- if (brace)
- mmfatal(PARSE_ERROR, "multidimensional arrays for simple data types are not supported");
- brace_open++;
- break;
- case ']':
- brace_open--;
- if (brace_open == 0)
- brace = true;
- break;
- case '\t':
- case ' ':
- break;
- default:
- if (brace_open == 0)
- brace = false;
- break;
- }
+ case '[':
+ if (brace)
+ mmfatal(PARSE_ERROR, "multidimensional arrays for simple data types are not supported");
+ brace_open++;
+ break;
+ case ']':
+ brace_open--;
+ if (brace_open == 0)
+ brace = true;
+ break;
+ case '\t':
+ case ' ':
+ break;
+ default:
+ if (brace_open == 0)
+ brace = false;
+ break;
}
- $$ = $1;
}
- ;
+ $$ = $1;
+ }
+ ;
-ecpg_param: PARAM { $$ = make_name(); } ;
+ecpg_param: PARAM
+ {
+ $$ = make_name();
+ }
+ ;
-ecpg_bconst: BCONST { $$ = $1; } ;
+ecpg_bconst: BCONST
+ {
+ $$ = $1;
+ }
+ ;
-ecpg_fconst: FCONST { $$ = make_name(); } ;
+ecpg_fconst: FCONST
+ {
+ $$ = make_name();
+ }
+ ;
-ecpg_sconst: SCONST { $$ = $1; } ;
+ecpg_sconst: SCONST
+ {
+ $$ = $1;
+ }
+ ;
-ecpg_xconst: XCONST { $$ = $1; } ;
+ecpg_xconst: XCONST
+ {
+ $$ = $1;
+ }
+ ;
-ecpg_ident: IDENT { $$ = $1; }
- | CSTRING { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
- ;
+ecpg_ident: IDENT
+ {
+ $$ = $1;
+ }
+ | CSTRING
+ {
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ ;
quoted_ident_stringvar: name
- { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
- | char_variable
- { $$ = make3_str(mm_strdup("("), $1, mm_strdup(")")); }
- ;
+ {
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ | char_variable
+ {
+ $$ = make3_str(mm_strdup("("), $1, mm_strdup(")"));
+ }
+ ;
/*
* C stuff
*/
-c_stuff_item: c_anything { $$ = $1; }
- | '(' ')' { $$ = mm_strdup("()"); }
- | '(' c_stuff ')'
- { $$ = cat_str(3, mm_strdup("("), $2, mm_strdup(")")); }
- ;
-
-c_stuff: c_stuff_item { $$ = $1; }
- | c_stuff c_stuff_item
- { $$ = cat2_str($1, $2); }
- ;
-
-c_list: c_term { $$ = $1; }
- | c_list ',' c_term { $$ = cat_str(3, $1, mm_strdup(","), $3); }
- ;
-
-c_term: c_stuff { $$ = $1; }
- | '{' c_list '}' { $$ = cat_str(3, mm_strdup("{"), $2, mm_strdup("}")); }
- ;
-
-c_thing: c_anything { $$ = $1; }
- | '(' { $$ = mm_strdup("("); }
- | ')' { $$ = mm_strdup(")"); }
- | ',' { $$ = mm_strdup(","); }
- | ';' { $$ = mm_strdup(";"); }
- ;
-
-c_anything: ecpg_ident { $$ = $1; }
- | Iconst { $$ = $1; }
- | ecpg_fconst { $$ = $1; }
- | ecpg_sconst { $$ = $1; }
- | '*' { $$ = mm_strdup("*"); }
- | '+' { $$ = mm_strdup("+"); }
- | '-' { $$ = mm_strdup("-"); }
- | '/' { $$ = mm_strdup("/"); }
- | '%' { $$ = mm_strdup("%"); }
- | NULL_P { $$ = mm_strdup("NULL"); }
- | S_ADD { $$ = mm_strdup("+="); }
- | S_AND { $$ = mm_strdup("&&"); }
- | S_ANYTHING { $$ = make_name(); }
- | S_AUTO { $$ = mm_strdup("auto"); }
- | S_CONST { $$ = mm_strdup("const"); }
- | S_DEC { $$ = mm_strdup("--"); }
- | S_DIV { $$ = mm_strdup("/="); }
- | S_DOTPOINT { $$ = mm_strdup(".*"); }
- | S_EQUAL { $$ = mm_strdup("=="); }
- | S_EXTERN { $$ = mm_strdup("extern"); }
- | S_INC { $$ = mm_strdup("++"); }
- | S_LSHIFT { $$ = mm_strdup("<<"); }
- | S_MEMBER { $$ = mm_strdup("->"); }
- | S_MEMPOINT { $$ = mm_strdup("->*"); }
- | S_MOD { $$ = mm_strdup("%="); }
- | S_MUL { $$ = mm_strdup("*="); }
- | S_NEQUAL { $$ = mm_strdup("!="); }
- | S_OR { $$ = mm_strdup("||"); }
- | S_REGISTER { $$ = mm_strdup("register"); }
- | S_RSHIFT { $$ = mm_strdup(">>"); }
- | S_STATIC { $$ = mm_strdup("static"); }
- | S_SUB { $$ = mm_strdup("-="); }
- | S_TYPEDEF { $$ = mm_strdup("typedef"); }
- | S_VOLATILE { $$ = mm_strdup("volatile"); }
- | SQL_BOOL { $$ = mm_strdup("bool"); }
- | ENUM_P { $$ = mm_strdup("enum"); }
- | HOUR_P { $$ = mm_strdup("hour"); }
- | INT_P { $$ = mm_strdup("int"); }
- | SQL_LONG { $$ = mm_strdup("long"); }
- | MINUTE_P { $$ = mm_strdup("minute"); }
- | MONTH_P { $$ = mm_strdup("month"); }
- | SECOND_P { $$ = mm_strdup("second"); }
- | SQL_SHORT { $$ = mm_strdup("short"); }
- | SQL_SIGNED { $$ = mm_strdup("signed"); }
- | SQL_STRUCT { $$ = mm_strdup("struct"); }
- | SQL_UNSIGNED { $$ = mm_strdup("unsigned"); }
- | YEAR_P { $$ = mm_strdup("year"); }
- | CHAR_P { $$ = mm_strdup("char"); }
- | FLOAT_P { $$ = mm_strdup("float"); }
- | TO { $$ = mm_strdup("to"); }
- | UNION { $$ = mm_strdup("union"); }
- | VARCHAR { $$ = mm_strdup("varchar"); }
- | '[' { $$ = mm_strdup("["); }
- | ']' { $$ = mm_strdup("]"); }
- | '=' { $$ = mm_strdup("="); }
- | ':' { $$ = mm_strdup(":"); }
- ;
-
-DeallocateStmt: DEALLOCATE prepared_name { check_declared_list($2); $$ = $2; }
- | DEALLOCATE PREPARE prepared_name { check_declared_list($3); $$ = $3; }
- | DEALLOCATE ALL { $$ = mm_strdup("all"); }
- | DEALLOCATE PREPARE ALL { $$ = mm_strdup("all"); }
- ;
-
-Iresult: Iconst { $$ = $1; }
- | '(' Iresult ')' { $$ = cat_str(3, mm_strdup("("), $2, mm_strdup(")")); }
- | Iresult '+' Iresult { $$ = cat_str(3, $1, mm_strdup("+"), $3); }
- | Iresult '-' Iresult { $$ = cat_str(3, $1, mm_strdup("-"), $3); }
- | Iresult '*' Iresult { $$ = cat_str(3, $1, mm_strdup("*"), $3); }
- | Iresult '/' Iresult { $$ = cat_str(3, $1, mm_strdup("/"), $3); }
- | Iresult '%' Iresult { $$ = cat_str(3, $1, mm_strdup("%"), $3); }
- | ecpg_sconst { $$ = $1; }
- | ColId { $$ = $1; }
- | ColId '(' var_type ')' { if (pg_strcasecmp($1, "sizeof") != 0)
- mmerror(PARSE_ERROR, ET_ERROR, "operator not allowed in variable definition");
- else
- $$ = cat_str(4, $1, mm_strdup("("), $3.type_str, mm_strdup(")"));
- }
- ;
-
-execute_rest: /* EMPTY */ { $$ = EMPTY; }
- | ecpg_using opt_ecpg_into { $$ = EMPTY; }
- | ecpg_into ecpg_using { $$ = EMPTY; }
- | ecpg_into { $$ = EMPTY; }
- ;
-
-ecpg_into: INTO into_list { $$ = EMPTY; }
- | into_descriptor { $$ = $1; }
- ;
-
-opt_ecpg_into: /* EMPTY */ { $$ = EMPTY; }
- | ecpg_into { $$ = $1; }
- ;
-
-ecpg_fetch_into: ecpg_into { $$ = $1; }
+c_stuff_item: c_anything
+ {
+ $$ = $1;
+ }
+ | '(' ')'
+ {
+ $$ = mm_strdup("()");
+ }
+ | '(' c_stuff ')'
+ {
+ $$ = cat_str(3, mm_strdup("("), $2, mm_strdup(")"));
+ }
+ ;
+
+c_stuff: c_stuff_item
+ {
+ $$ = $1;
+ }
+ | c_stuff c_stuff_item
+ {
+ $$ = cat2_str($1, $2);
+ }
+ ;
+
+c_list: c_term
+ {
+ $$ = $1;
+ }
+ | c_list ',' c_term
+ {
+ $$ = cat_str(3, $1, mm_strdup(","), $3);
+ }
+ ;
+
+c_term: c_stuff
+ {
+ $$ = $1;
+ }
+ | '{' c_list '}'
+ {
+ $$ = cat_str(3, mm_strdup("{"), $2, mm_strdup("}"));
+ }
+ ;
+
+c_thing: c_anything { $$ = $1; }
+ | '(' { $$ = mm_strdup("("); }
+ | ')' { $$ = mm_strdup(")"); }
+ | ',' { $$ = mm_strdup(","); }
+ | ';' { $$ = mm_strdup(";"); }
+ ;
+
+c_anything: ecpg_ident { $$ = $1; }
+ | Iconst { $$ = $1; }
+ | ecpg_fconst { $$ = $1; }
+ | ecpg_sconst { $$ = $1; }
+ | '*' { $$ = mm_strdup("*"); }
+ | '+' { $$ = mm_strdup("+"); }
+ | '-' { $$ = mm_strdup("-"); }
+ | '/' { $$ = mm_strdup("/"); }
+ | '%' { $$ = mm_strdup("%"); }
+ | NULL_P { $$ = mm_strdup("NULL"); }
+ | S_ADD { $$ = mm_strdup("+="); }
+ | S_AND { $$ = mm_strdup("&&"); }
+ | S_ANYTHING { $$ = make_name(); }
+ | S_AUTO { $$ = mm_strdup("auto"); }
+ | S_CONST { $$ = mm_strdup("const"); }
+ | S_DEC { $$ = mm_strdup("--"); }
+ | S_DIV { $$ = mm_strdup("/="); }
+ | S_DOTPOINT { $$ = mm_strdup(".*"); }
+ | S_EQUAL { $$ = mm_strdup("=="); }
+ | S_EXTERN { $$ = mm_strdup("extern"); }
+ | S_INC { $$ = mm_strdup("++"); }
+ | S_LSHIFT { $$ = mm_strdup("<<"); }
+ | S_MEMBER { $$ = mm_strdup("->"); }
+ | S_MEMPOINT { $$ = mm_strdup("->*"); }
+ | S_MOD { $$ = mm_strdup("%="); }
+ | S_MUL { $$ = mm_strdup("*="); }
+ | S_NEQUAL { $$ = mm_strdup("!="); }
+ | S_OR { $$ = mm_strdup("||"); }
+ | S_REGISTER { $$ = mm_strdup("register"); }
+ | S_RSHIFT { $$ = mm_strdup(">>"); }
+ | S_STATIC { $$ = mm_strdup("static"); }
+ | S_SUB { $$ = mm_strdup("-="); }
+ | S_TYPEDEF { $$ = mm_strdup("typedef"); }
+ | S_VOLATILE { $$ = mm_strdup("volatile"); }
+ | SQL_BOOL { $$ = mm_strdup("bool"); }
+ | ENUM_P { $$ = mm_strdup("enum"); }
+ | HOUR_P { $$ = mm_strdup("hour"); }
+ | INT_P { $$ = mm_strdup("int"); }
+ | SQL_LONG { $$ = mm_strdup("long"); }
+ | MINUTE_P { $$ = mm_strdup("minute"); }
+ | MONTH_P { $$ = mm_strdup("month"); }
+ | SECOND_P { $$ = mm_strdup("second"); }
+ | SQL_SHORT { $$ = mm_strdup("short"); }
+ | SQL_SIGNED { $$ = mm_strdup("signed"); }
+ | SQL_STRUCT { $$ = mm_strdup("struct"); }
+ | SQL_UNSIGNED { $$ = mm_strdup("unsigned"); }
+ | YEAR_P { $$ = mm_strdup("year"); }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | FLOAT_P { $$ = mm_strdup("float"); }
+ | TO { $$ = mm_strdup("to"); }
+ | UNION { $$ = mm_strdup("union"); }
+ | VARCHAR { $$ = mm_strdup("varchar"); }
+ | '[' { $$ = mm_strdup("["); }
+ | ']' { $$ = mm_strdup("]"); }
+ | '=' { $$ = mm_strdup("="); }
+ | ':' { $$ = mm_strdup(":"); }
+ ;
+
+DeallocateStmt: DEALLOCATE prepared_name
+ {
+ check_declared_list($2);
+ $$ = $2;
+ }
+ | DEALLOCATE PREPARE prepared_name
+ {
+ check_declared_list($3);
+ $$ = $3;
+ }
+ | DEALLOCATE ALL
+ {
+ $$ = mm_strdup("all");
+ }
+ | DEALLOCATE PREPARE ALL
+ {
+ $$ = mm_strdup("all");
+ }
+ ;
+
+Iresult: Iconst
+ {
+ $$ = $1;
+ }
+ | '(' Iresult ')'
+ {
+ $$ = cat_str(3, mm_strdup("("), $2, mm_strdup(")"));
+ }
+ | Iresult '+' Iresult
+ {
+ $$ = cat_str(3, $1, mm_strdup("+"), $3);
+ }
+ | Iresult '-' Iresult
+ {
+ $$ = cat_str(3, $1, mm_strdup("-"), $3);
+ }
+ | Iresult '*' Iresult
+ {
+ $$ = cat_str(3, $1, mm_strdup("*"), $3);
+ }
+ | Iresult '/' Iresult
+ {
+ $$ = cat_str(3, $1, mm_strdup("/"), $3);
+ }
+ | Iresult '%' Iresult
+ {
+ $$ = cat_str(3, $1, mm_strdup("%"), $3);
+ }
+ | ecpg_sconst
+ {
+ $$ = $1;
+ }
+ | ColId
+ {
+ $$ = $1;
+ }
+ | ColId '(' var_type ')'
+ {
+ if (pg_strcasecmp($1, "sizeof") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "operator not allowed in variable definition");
+ else
+ $$ = cat_str(4, $1, mm_strdup("("), $3.type_str, mm_strdup(")"));
+ }
+ ;
+
+execute_rest: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | ecpg_using opt_ecpg_into
+ {
+ $$ = EMPTY;
+ }
+ | ecpg_into ecpg_using
+ {
+ $$ = EMPTY;
+ }
+ | ecpg_into
+ {
+ $$ = EMPTY;
+ }
+ ;
+
+ecpg_into: INTO into_list
+ {
+ $$ = EMPTY;
+ }
+ | into_descriptor
+ {
+ $$ = $1;
+ }
+ ;
+
+opt_ecpg_into: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | ecpg_into
+ {
+ $$ = $1;
+ }
+ ;
+
+ecpg_fetch_into: ecpg_into
+ {
+ $$ = $1;
+ }
| using_descriptor
{
struct variable *var;
@@ -2015,20 +2494,31 @@ ecpg_fetch_into: ecpg_into { $$ = $1; }
}
;
-opt_ecpg_fetch_into: /* EMPTY */ { $$ = EMPTY; }
- | ecpg_fetch_into { $$ = $1; }
+opt_ecpg_fetch_into: /* EMPTY */
+ {
+ $$ = EMPTY;
+ }
+ | ecpg_fetch_into
+ {
+ $$ = $1;
+ }
;
%%
-void base_yyerror(const char *error)
+void
+base_yyerror(const char *error)
{
/* translator: %s is typically the translation of "syntax error" */
mmerror(PARSE_ERROR, ET_ERROR, "%s at or near \"%s\"",
_(error), token_start ? token_start : base_yytext);
}
-void parser_init(void)
+void
+parser_init(void)
{
- /* This function is empty. It only exists for compatibility with the backend parser right now. */
+ /*
+ * This function is empty. It only exists for compatibility with the
+ * backend parser right now.
+ */
}
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 27261f42d8d..f363a346595 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -35,8 +35,8 @@
extern YYSTYPE base_yylval;
-static int xcdepth = 0; /* depth of nesting in slash-star comments */
-static char *dolqstart = NULL; /* current $foo$ quote start string */
+static int xcdepth = 0; /* depth of nesting in slash-star comments */
+static char *dolqstart = NULL; /* current $foo$ quote start string */
/*
* literalbuf is used to accumulate literal values when multiple rules
@@ -44,15 +44,15 @@ static char *dolqstart = NULL; /* current $foo$ quote start string */
* to empty, addlit to add text. Note that the buffer is permanently
* malloc'd to the largest size needed so far in the current run.
*/
-static char *literalbuf = NULL; /* expandable buffer */
-static int literallen; /* actual current length */
-static int literalalloc; /* current allocated buffer size */
+static char *literalbuf = NULL; /* expandable buffer */
+static int literallen; /* actual current length */
+static int literalalloc; /* current allocated buffer size */
/* Used for detecting global state together with braces_open */
-static int parenths_open;
+static int parenths_open;
/* Used to tell parse_include() whether the command was #include or #include_next */
-static bool include_next;
+static bool include_next;
#define startlit() (literalbuf[0] = '\0', literallen = 0)
static void addlit(char *ytext, int yleng);
@@ -63,11 +63,11 @@ static bool ecpg_isspace(char ch);
static bool isdefine(void);
static bool isinformixdefine(void);
-char *token_start;
+char *token_start;
/* vars to keep track of start conditions when scanning literals */
-static int state_before_str_start;
-static int state_before_str_stop;
+static int state_before_str_start;
+static int state_before_str_stop;
/*
* State for handling include files and macro expansion. We use a new
@@ -78,10 +78,10 @@ static int state_before_str_stop;
*/
static struct _yy_buffer
{
- YY_BUFFER_STATE buffer;
- long lineno;
- char *filename;
- struct _yy_buffer *next;
+ YY_BUFFER_STATE buffer;
+ long lineno;
+ char *filename;
+ struct _yy_buffer *next;
} *yy_buffer = NULL;
/*
@@ -541,7 +541,9 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
<xb>{xbinside} {
addlit(yytext, yyleng);
}
-<xb><<EOF>> { mmfatal(PARSE_ERROR, "unterminated bit string literal"); }
+<xb><<EOF>> {
+ mmfatal(PARSE_ERROR, "unterminated bit string literal");
+ }
<SQL>{xhstart} {
token_start = yytext;
@@ -549,7 +551,9 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
BEGIN(xh);
startlit();
}
-<xh><<EOF>> { mmfatal(PARSE_ERROR, "unterminated hexadecimal string literal"); }
+<xh><<EOF>> {
+ mmfatal(PARSE_ERROR, "unterminated hexadecimal string literal");
+ }
<C>{xqstart} {
token_start = yytext;
@@ -560,9 +564,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
<SQL>{
{xnstart} {
- /* National character.
- * Transfer it as-is to the backend.
- */
+ /* National character. Transfer it as-is to the backend. */
token_start = yytext;
state_before_str_start = YYSTATE;
BEGIN(xn);
@@ -651,29 +653,37 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
}
}
-<xq,xe,xn,xus>{xqdouble} { addlit(yytext, yyleng); }
-<xqc>{xqcquote} { addlit(yytext, yyleng); }
-<xq,xqc,xn,xus>{xqinside} { addlit(yytext, yyleng); }
-<xe>{xeinside} {
+<xq,xe,xn,xus>{xqdouble} {
+ addlit(yytext, yyleng);
+ }
+<xqc>{xqcquote} {
+ addlit(yytext, yyleng);
+ }
+<xq,xqc,xn,xus>{xqinside} {
addlit(yytext, yyleng);
}
-<xe>{xeunicode} {
+<xe>{xeinside} {
addlit(yytext, yyleng);
}
-<xe>{xeescape} {
+<xe>{xeunicode} {
addlit(yytext, yyleng);
}
-<xe>{xeoctesc} {
+<xe>{xeescape} {
addlit(yytext, yyleng);
}
-<xe>{xehexesc} {
+<xe>{xeoctesc} {
+ addlit(yytext, yyleng);
+ }
+<xe>{xehexesc} {
addlit(yytext, yyleng);
}
<xe>. {
/* This is only needed for \ just before EOF */
addlitchar(yytext[0]);
}
-<xq,xqc,xe,xn,xus><<EOF>> { mmfatal(PARSE_ERROR, "unterminated quoted string"); }
+<xq,xqc,xe,xn,xus><<EOF>> {
+ mmfatal(PARSE_ERROR, "unterminated quoted string");
+ }
<SQL>{
{dolqdelim} {
@@ -693,7 +703,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
}
} /* <SQL> */
-<xdolq>{dolqdelim} {
+<xdolq>{dolqdelim} {
if (strcmp(yytext, dolqstart) == 0)
{
addlit(yytext, yyleng);
@@ -724,7 +734,9 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
/* single quote or dollar sign */
addlitchar(yytext[0]);
}
-<xdolq><<EOF>> { mmfatal(PARSE_ERROR, "unterminated dollar-quoted string"); }
+<xdolq><<EOF>> {
+ mmfatal(PARSE_ERROR, "unterminated dollar-quoted string");
+ }
<SQL>{
{xdstart} {
@@ -743,6 +755,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
BEGIN(state_before_str_start);
if (literallen == 0)
mmerror(PARSE_ERROR, ET_ERROR, "zero-length delimited identifier");
+
/*
* The server will truncate the identifier here. We do
* not, as (1) it does not change the result; (2) we don't
@@ -763,26 +776,34 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
BEGIN(state_before_str_start);
if (literallen == 0)
mmerror(PARSE_ERROR, ET_ERROR, "zero-length delimited identifier");
- /* The backend will truncate the identifier here. We do not as it does not change the result. */
+
+ /*
+ * The backend will truncate the identifier here. We do
+ * not as it does not change the result.
+ */
base_yylval.str = psprintf("U&\"%s\"", literalbuf);
return UIDENT;
}
-<xd,xui>{xddouble} {
+<xd,xui>{xddouble} {
addlit(yytext, yyleng);
}
-<xd,xui>{xdinside} {
+<xd,xui>{xdinside} {
addlit(yytext, yyleng);
}
-<xd,xui><<EOF>> { mmfatal(PARSE_ERROR, "unterminated quoted identifier"); }
+<xd,xui><<EOF>> {
+ mmfatal(PARSE_ERROR, "unterminated quoted identifier");
+ }
<C>{xdstart} {
state_before_str_start = YYSTATE;
BEGIN(xdc);
startlit();
}
-<xdc>{xdcinside} {
+<xdc>{xdcinside} {
addlit(yytext, yyleng);
}
-<xdc><<EOF>> { mmfatal(PARSE_ERROR, "unterminated quoted string"); }
+<xdc><<EOF>> {
+ mmfatal(PARSE_ERROR, "unterminated quoted string");
+ }
<SQL>{
{typecast} {
@@ -819,21 +840,20 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
return NOT_EQUALS;
}
-{informix_special} {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- unput(':');
- }
- else
- return yytext[0];
+{informix_special} {
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ unput(':');
+ }
+ else
+ return yytext[0];
}
{self} {
/*
- * We may find a ';' inside a structure
- * definition in a TYPE or VAR statement.
- * This is not an EOL marker.
+ * We may find a ';' inside a structure definition in a
+ * TYPE or VAR statement. This is not an EOL marker.
*/
if (yytext[0] == ';' && struct_level == 0)
BEGIN(C);
@@ -878,7 +898,8 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
for (ic = nchars - 2; ic >= 0; ic--)
{
- char c = yytext[ic];
+ char c = yytext[ic];
+
if (c == '~' || c == '!' || c == '@' ||
c == '#' || c == '^' || c == '&' ||
c == '|' || c == '`' || c == '?' ||
@@ -891,11 +912,12 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
* didn't find a qualifying character, so remove
* all trailing [+-]
*/
- do {
+ do
+ {
nchars--;
} while (nchars > 1 &&
- (yytext[nchars - 1] == '+' ||
- yytext[nchars - 1] == '-'));
+ (yytext[nchars - 1] == '+' ||
+ yytext[nchars - 1] == '-'));
}
}
@@ -903,6 +925,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
{
/* Strip the unwanted chars from the token */
yyless(nchars);
+
/*
* If what we have left is only one char, and it's
* one of the characters matching "self", then
@@ -912,6 +935,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
if (nchars == 1 &&
strchr(",()[].;:+-*/%^<>=", yytext[0]))
return yytext[0];
+
/*
* Likewise, if what we have left is two chars, and
* those match the tokens ">=", "<=", "=>", "<>" or
@@ -999,16 +1023,16 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
* Note that some trailing junk is valid in C (such as 100LL), so we
* contain this to SQL mode.
*/
-{decinteger_junk} {
+{decinteger_junk} {
mmfatal(PARSE_ERROR, "trailing junk after numeric literal");
}
-{hexinteger_junk} {
+{hexinteger_junk} {
mmfatal(PARSE_ERROR, "trailing junk after numeric literal");
}
-{octinteger_junk} {
+{octinteger_junk} {
mmfatal(PARSE_ERROR, "trailing junk after numeric literal");
}
-{bininteger_junk} {
+{bininteger_junk} {
mmfatal(PARSE_ERROR, "trailing junk after numeric literal");
}
{numeric_junk} {
@@ -1019,7 +1043,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
}
:{identifier}((("->"|\.){identifier})|(\[{array}\]))* {
- base_yylval.str = mm_strdup(yytext+1);
+ base_yylval.str = mm_strdup(yytext + 1);
return CVARIABLE;
}
@@ -1027,7 +1051,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
/* First check to see if it's a define symbol to expand */
if (!isdefine())
{
- int kwvalue;
+ int kwvalue;
/*
* User-defined typedefs override SQL keywords, but
@@ -1053,8 +1077,8 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
*
* The backend will attempt to truncate and case-fold
* the identifier, but I see no good reason for ecpg
- * to do so; that's just another way that ecpg could get
- * out of step with the backend.
+ * to do so; that's just another way that ecpg could
+ * get out of step with the backend.
*/
base_yylval.str = mm_strdup(yytext);
return IDENT;
@@ -1070,75 +1094,82 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
* Begin ECPG-specific rules
*/
-<C>{exec_sql} { BEGIN(SQL); return SQL_START; }
+<C>{exec_sql} {
+ BEGIN(SQL);
+ return SQL_START;
+ }
<C>{informix_special} {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- BEGIN(SQL);
- return SQL_START;
- }
- else
- return S_ANYTHING;
- }
-<C>{ccomment} { ECHO; }
-<C>{cppinclude} {
- if (system_includes)
- {
- include_next = false;
- BEGIN(incl);
- }
- else
- {
- base_yylval.str = mm_strdup(yytext);
- return CPP_LINE;
- }
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ BEGIN(SQL);
+ return SQL_START;
}
-<C>{cppinclude_next} {
- if (system_includes)
- {
- include_next = true;
- BEGIN(incl);
- }
- else
- {
- base_yylval.str = mm_strdup(yytext);
- return CPP_LINE;
- }
+ else
+ return S_ANYTHING;
+ }
+<C>{ccomment} {
+ ECHO;
+ }
+<C>{cppinclude} {
+ if (system_includes)
+ {
+ include_next = false;
+ BEGIN(incl);
}
-<C,SQL>{cppline} {
+ else
+ {
base_yylval.str = mm_strdup(yytext);
return CPP_LINE;
}
-<C>{identifier} {
- /*
- * Try to detect a function name:
- * look for identifiers at the global scope
- * keep the last identifier before the first '(' and '{'
- */
- if (braces_open == 0 && parenths_open == 0)
- {
- if (current_function)
- free(current_function);
- current_function = mm_strdup(yytext);
- }
- /* Informix uses SQL defines only in SQL space */
- /* however, some defines have to be taken care of for compatibility */
- if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine())
- {
- int kwvalue;
+ }
+<C>{cppinclude_next} {
+ if (system_includes)
+ {
+ include_next = true;
+ BEGIN(incl);
+ }
+ else
+ {
+ base_yylval.str = mm_strdup(yytext);
+ return CPP_LINE;
+ }
+ }
+<C,SQL>{cppline} {
+ base_yylval.str = mm_strdup(yytext);
+ return CPP_LINE;
+ }
+<C>{identifier} {
+ /*
+ * Try to detect a function name:
+ * look for identifiers at the global scope
+ * keep the last identifier before the first '(' and '{'
+ */
+ if (braces_open == 0 && parenths_open == 0)
+ {
+ if (current_function)
+ free(current_function);
+ current_function = mm_strdup(yytext);
+ }
+ /* Informix uses SQL defines only in SQL space */
+ /* however, some defines have to be taken care of for compatibility */
+ if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine())
+ {
+ int kwvalue;
- kwvalue = ScanCKeywordLookup(yytext);
- if (kwvalue >= 0)
- return kwvalue;
- else
- {
- base_yylval.str = mm_strdup(yytext);
- return IDENT;
- }
+ kwvalue = ScanCKeywordLookup(yytext);
+ if (kwvalue >= 0)
+ return kwvalue;
+ else
+ {
+ base_yylval.str = mm_strdup(yytext);
+ return IDENT;
}
}
-<C>{xcstop} { mmerror(PARSE_ERROR, ET_ERROR, "nested /* ... */ comments"); }
+ }
+<C>{xcstop} {
+ mmerror(PARSE_ERROR, ET_ERROR, "nested /* ... */ comments");
+ }
<C>":" { return ':'; }
<C>";" { return ';'; }
<C>"," { return ','; }
@@ -1174,44 +1205,46 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
<C>{other} { return S_ANYTHING; }
<C>{exec_sql}{define}{space}* { BEGIN(def_ident); }
<C>{informix_special}{define}{space}* {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- BEGIN(def_ident);
- }
- else
- {
- yyless(1);
- return S_ANYTHING;
- }
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ BEGIN(def_ident);
+ }
+ else
+ {
+ yyless(1);
+ return S_ANYTHING;
}
-<C>{exec_sql}{undef}{space}* { BEGIN(undef); }
+ }
+<C>{exec_sql}{undef}{space}* {
+ BEGIN(undef);
+ }
<C>{informix_special}{undef}{space}* {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- BEGIN(undef);
- }
- else
- {
- yyless(1);
- return S_ANYTHING;
- }
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ BEGIN(undef);
}
+ else
+ {
+ yyless(1);
+ return S_ANYTHING;
+ }
+ }
<undef>{identifier}{space}*";" {
- struct _defines *ptr, *ptr2 = NULL;
- int i;
+ struct _defines *ptr,
+ *ptr2 = NULL;
+ int i;
/*
- * Skip the ";" and trailing whitespace. Note that yytext
- * contains at least one non-space character plus the ";"
+ * Skip the ";" and trailing whitespace. Note that yytext
+ * contains at least one non-space character plus the ";"
*/
- for (i = strlen(yytext)-2;
+ for (i = strlen(yytext) - 2;
i > 0 && ecpg_isspace(yytext[i]);
i--)
;
- yytext[i+1] = '\0';
-
+ yytext[i + 1] = '\0';
/* Find and unset any matching define; should be only 1 */
for (ptr = defines; ptr; ptr2 = ptr, ptr = ptr->next)
@@ -1237,88 +1270,90 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
BEGIN(C);
}
<undef>{other}|\n {
- mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL UNDEF command");
- yyterminate();
+ mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL UNDEF command");
+ yyterminate();
+ }
+<C>{exec_sql}{include}{space}* {
+ BEGIN(incl);
}
-<C>{exec_sql}{include}{space}* { BEGIN(incl); }
<C>{informix_special}{include}{space}* {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- BEGIN(incl);
- }
- else
- {
- yyless(1);
- return S_ANYTHING;
- }
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ BEGIN(incl);
}
-<C,xskip>{exec_sql}{ifdef}{space}* {
- if (preproc_tos >= MAX_NESTED_IF-1)
- mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
- preproc_tos++;
- stacked_if_value[preproc_tos].active = false;
- stacked_if_value[preproc_tos].saw_active = false;
- stacked_if_value[preproc_tos].else_branch = false;
- ifcond = true;
- BEGIN(xcond);
+ else
+ {
+ yyless(1);
+ return S_ANYTHING;
}
+ }
+<C,xskip>{exec_sql}{ifdef}{space}* {
+ if (preproc_tos >= MAX_NESTED_IF - 1)
+ mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
+ preproc_tos++;
+ stacked_if_value[preproc_tos].active = false;
+ stacked_if_value[preproc_tos].saw_active = false;
+ stacked_if_value[preproc_tos].else_branch = false;
+ ifcond = true;
+ BEGIN(xcond);
+ }
<C,xskip>{informix_special}{ifdef}{space}* {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- if (preproc_tos >= MAX_NESTED_IF-1)
- mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
- preproc_tos++;
- stacked_if_value[preproc_tos].active = false;
- stacked_if_value[preproc_tos].saw_active = false;
- stacked_if_value[preproc_tos].else_branch = false;
- ifcond = true;
- BEGIN(xcond);
- }
- else
- {
- yyless(1);
- return S_ANYTHING;
- }
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ if (preproc_tos >= MAX_NESTED_IF - 1)
+ mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
+ preproc_tos++;
+ stacked_if_value[preproc_tos].active = false;
+ stacked_if_value[preproc_tos].saw_active = false;
+ stacked_if_value[preproc_tos].else_branch = false;
+ ifcond = true;
+ BEGIN(xcond);
}
-<C,xskip>{exec_sql}{ifndef}{space}* {
- if (preproc_tos >= MAX_NESTED_IF-1)
- mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
- preproc_tos++;
- stacked_if_value[preproc_tos].active = false;
- stacked_if_value[preproc_tos].saw_active = false;
- stacked_if_value[preproc_tos].else_branch = false;
- ifcond = false;
- BEGIN(xcond);
+ else
+ {
+ yyless(1);
+ return S_ANYTHING;
}
+ }
+<C,xskip>{exec_sql}{ifndef}{space}* {
+ if (preproc_tos >= MAX_NESTED_IF - 1)
+ mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
+ preproc_tos++;
+ stacked_if_value[preproc_tos].active = false;
+ stacked_if_value[preproc_tos].saw_active = false;
+ stacked_if_value[preproc_tos].else_branch = false;
+ ifcond = false;
+ BEGIN(xcond);
+ }
<C,xskip>{informix_special}{ifndef}{space}* {
- /* are we simulating Informix? */
- if (INFORMIX_MODE)
- {
- if (preproc_tos >= MAX_NESTED_IF-1)
- mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
- preproc_tos++;
- stacked_if_value[preproc_tos].active = false;
- stacked_if_value[preproc_tos].saw_active = false;
- stacked_if_value[preproc_tos].else_branch = false;
- ifcond = false;
- BEGIN(xcond);
- }
- else
- {
- yyless(1);
- return S_ANYTHING;
- }
- }
-<C,xskip>{exec_sql}{elif}{space}* {
- if (preproc_tos == 0)
- mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
- if (stacked_if_value[preproc_tos].else_branch)
- mmfatal(PARSE_ERROR, "missing \"EXEC SQL ENDIF;\"");
- ifcond = true;
+ /* are we simulating Informix? */
+ if (INFORMIX_MODE)
+ {
+ if (preproc_tos >= MAX_NESTED_IF - 1)
+ mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
+ preproc_tos++;
+ stacked_if_value[preproc_tos].active = false;
+ stacked_if_value[preproc_tos].saw_active = false;
+ stacked_if_value[preproc_tos].else_branch = false;
+ ifcond = false;
BEGIN(xcond);
}
+ else
+ {
+ yyless(1);
+ return S_ANYTHING;
+ }
+ }
+<C,xskip>{exec_sql}{elif}{space}* {
+ if (preproc_tos == 0)
+ mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
+ if (stacked_if_value[preproc_tos].else_branch)
+ mmfatal(PARSE_ERROR, "missing \"EXEC SQL ENDIF;\"");
+ ifcond = true;
+ BEGIN(xcond);
+ }
<C,xskip>{informix_special}{elif}{space}* {
/* are we simulating Informix? */
if (INFORMIX_MODE)
@@ -1337,7 +1372,8 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
}
}
-<C,xskip>{exec_sql}{else}{space}*";" { /* only exec sql endif pops the stack, so take care of duplicated 'else' */
+<C,xskip>{exec_sql}{else}{space}*";" {
+ /* only exec sql endif pops the stack, so take care of duplicated 'else' */
if (preproc_tos == 0)
mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
else if (stacked_if_value[preproc_tos].else_branch)
@@ -1346,7 +1382,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
{
stacked_if_value[preproc_tos].else_branch = true;
stacked_if_value[preproc_tos].active =
- (stacked_if_value[preproc_tos-1].active &&
+ (stacked_if_value[preproc_tos - 1].active &&
!stacked_if_value[preproc_tos].saw_active);
stacked_if_value[preproc_tos].saw_active = true;
@@ -1356,7 +1392,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
BEGIN(xskip);
}
}
-<C,xskip>{informix_special}{else}{space}*";" {
+<C,xskip>{informix_special}{else}{space}*";" {
/* are we simulating Informix? */
if (INFORMIX_MODE)
{
@@ -1368,7 +1404,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
{
stacked_if_value[preproc_tos].else_branch = true;
stacked_if_value[preproc_tos].active =
- (stacked_if_value[preproc_tos-1].active &&
+ (stacked_if_value[preproc_tos - 1].active &&
!stacked_if_value[preproc_tos].saw_active);
stacked_if_value[preproc_tos].saw_active = true;
@@ -1391,11 +1427,11 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
preproc_tos--;
if (stacked_if_value[preproc_tos].active)
- BEGIN(C);
+ BEGIN(C);
else
- BEGIN(xskip);
+ BEGIN(xskip);
}
-<C,xskip>{informix_special}{endif}{space}*";" {
+<C,xskip>{informix_special}{endif}{space}*";" {
/* are we simulating Informix? */
if (INFORMIX_MODE)
{
@@ -1416,23 +1452,24 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
}
}
-<xskip>{other} { /* ignore */ }
+<xskip>{other} { /* ignore */ }
<xcond>{identifier}{space}*";" {
{
struct _defines *defptr;
unsigned int i;
- bool this_active;
+ bool this_active;
/*
- * Skip the ";" and trailing whitespace. Note that yytext
- * contains at least one non-space character plus the ";"
+ * Skip the ";" and trailing whitespace. Note that
+ * yytext contains at least one non-space character
+ * plus the ";"
*/
- for (i = strlen(yytext)-2;
+ for (i = strlen(yytext) - 2;
i > 0 && ecpg_isspace(yytext[i]);
i--)
- ;
- yytext[i+1] = '\0';
+ /* skip */ ;
+ yytext[i + 1] = '\0';
/* Does a definition exist? */
for (defptr = defines; defptr; defptr = defptr->next)
@@ -1448,7 +1485,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
this_active = (defptr ? ifcond : !ifcond);
stacked_if_value[preproc_tos].active =
- (stacked_if_value[preproc_tos-1].active &&
+ (stacked_if_value[preproc_tos - 1].active &&
!stacked_if_value[preproc_tos].saw_active &&
this_active);
stacked_if_value[preproc_tos].saw_active |= this_active;
@@ -1460,59 +1497,59 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
BEGIN(xskip);
}
-<xcond>{other}|\n {
- mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL IFDEF command");
- yyterminate();
- }
+<xcond>{other}|\n {
+ mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL IFDEF command");
+ yyterminate();
+ }
<def_ident>{identifier} {
- newdefsymbol = mm_strdup(yytext);
- BEGIN(def);
- startlit();
- }
-<def_ident>{other}|\n {
- mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL DEFINE command");
- yyterminate();
- }
-<def>{space}*";" {
- struct _defines *ptr;
+ newdefsymbol = mm_strdup(yytext);
+ BEGIN(def);
+ startlit();
+ }
+<def_ident>{other}|\n {
+ mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL DEFINE command");
+ yyterminate();
+ }
+<def>{space}*";" {
+ struct _defines *ptr;
- /* Does it already exist? */
- for (ptr = defines; ptr != NULL; ptr = ptr->next)
- {
- if (strcmp(newdefsymbol, ptr->name) == 0)
- {
- free(ptr->value);
- ptr->value = mm_strdup(literalbuf);
- /* Don't leak newdefsymbol */
- free(newdefsymbol);
- break;
- }
- }
- if (ptr == NULL)
+ /* Does it already exist? */
+ for (ptr = defines; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp(newdefsymbol, ptr->name) == 0)
{
- /* Not present, make a new entry */
- ptr = (struct _defines *) mm_alloc(sizeof(struct _defines));
-
- ptr->name = newdefsymbol;
+ free(ptr->value);
ptr->value = mm_strdup(literalbuf);
- ptr->cmdvalue = NULL;
- ptr->used = NULL;
- ptr->next = defines;
- defines = ptr;
+ /* Don't leak newdefsymbol */
+ free(newdefsymbol);
+ break;
}
-
- BEGIN(C);
}
-<def>[^;] { addlit(yytext, yyleng); }
-<incl>\<[^\>]+\>{space}*";"? { parse_include(); }
+ if (ptr == NULL)
+ {
+ /* Not present, make a new entry */
+ ptr = (struct _defines *) mm_alloc(sizeof(struct _defines));
+
+ ptr->name = newdefsymbol;
+ ptr->value = mm_strdup(literalbuf);
+ ptr->cmdvalue = NULL;
+ ptr->used = NULL;
+ ptr->next = defines;
+ defines = ptr;
+ }
+
+ BEGIN(C);
+ }
+<def>[^;] { addlit(yytext, yyleng); }
+<incl>\<[^\>]+\>{space}*";"? { parse_include(); }
<incl>{dquote}{xdinside}{dquote}{space}*";"? { parse_include(); }
-<incl>[^;\<\>\"]+";" { parse_include(); }
-<incl>{other}|\n {
+<incl>[^;\<\>\"]+";" { parse_include(); }
+<incl>{other}|\n {
mmfatal(PARSE_ERROR, "syntax error in EXEC SQL INCLUDE command");
yyterminate();
}
-<<EOF>> {
+<<EOF>> {
if (yy_buffer == NULL)
{
/* No more input */
@@ -1527,7 +1564,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
{
/* Revert to previous input source */
struct _yy_buffer *yb = yy_buffer;
- int i;
+ int i;
struct _defines *ptr;
/* Check to see if we are exiting a macro value */
@@ -1559,11 +1596,12 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
if (i != 0)
output_line_number();
-
}
}
-<INITIAL>{other}|\n { mmfatal(PARSE_ERROR, "internal error: unreachable state; please report this to <%s>", PACKAGE_BUGREPORT); }
+<INITIAL>{other}|\n {
+ mmfatal(PARSE_ERROR, "internal error: unreachable state; please report this to <%s>", PACKAGE_BUGREPORT);
+ }
%%
@@ -1599,15 +1637,15 @@ static void
addlit(char *ytext, int yleng)
{
/* enlarge buffer if needed */
- if ((literallen+yleng) >= literalalloc)
+ if ((literallen + yleng) >= literalalloc)
{
do
literalalloc *= 2;
- while ((literallen+yleng) >= literalalloc);
+ while ((literallen + yleng) >= literalalloc);
literalbuf = (char *) realloc(literalbuf, literalalloc);
}
/* append new data, add trailing null */
- memcpy(literalbuf+literallen, ytext, yleng);
+ memcpy(literalbuf + literallen, ytext, yleng);
literallen += yleng;
literalbuf[literallen] = '\0';
}
@@ -1616,7 +1654,7 @@ static void
addlitchar(unsigned char ychar)
{
/* enlarge buffer if needed */
- if ((literallen+1) >= literalalloc)
+ if ((literallen + 1) >= literalalloc)
{
literalalloc *= 2;
literalbuf = (char *) realloc(literalbuf, literalalloc);
@@ -1655,12 +1693,12 @@ parse_include(void)
/* got the include file name */
struct _yy_buffer *yb;
struct _include_path *ip;
- char inc_file[MAXPGPATH];
+ char inc_file[MAXPGPATH];
unsigned int i;
yb = mm_alloc(sizeof(struct _yy_buffer));
- yb->buffer = YY_CURRENT_BUFFER;
+ yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = input_filename;
yb->next = yy_buffer;
@@ -1668,10 +1706,10 @@ parse_include(void)
yy_buffer = yb;
/*
- * skip the ";" if there is one and trailing whitespace. Note that
- * yytext contains at least one non-space character plus the ";"
+ * skip the ";" if there is one and trailing whitespace. Note that yytext
+ * contains at least one non-space character plus the ";"
*/
- for (i = strlen(yytext)-2;
+ for (i = strlen(yytext) - 2;
i > 0 && ecpg_isspace(yytext[i]);
i--)
;
@@ -1679,17 +1717,21 @@ parse_include(void)
if (yytext[i] == ';')
i--;
- yytext[i+1] = '\0';
+ yytext[i + 1] = '\0';
yyin = NULL;
/* If file name is enclosed in '"' remove these and look only in '.' */
- /* Informix does look into all include paths though, except filename starts with '/' */
+
+ /*
+ * Informix does look into all include paths though, except filename
+ * starts with '/'
+ */
if (yytext[0] == '"' && yytext[i] == '"' &&
((compat != ECPG_COMPAT_INFORMIX && compat != ECPG_COMPAT_INFORMIX_SE) || yytext[1] == '/'))
{
yytext[i] = '\0';
- memmove(yytext, yytext+1, strlen(yytext));
+ memmove(yytext, yytext + 1, strlen(yytext));
strlcpy(inc_file, yytext, sizeof(inc_file));
yyin = fopen(inc_file, "r");
@@ -1708,7 +1750,7 @@ parse_include(void)
if ((yytext[0] == '"' && yytext[i] == '"') || (yytext[0] == '<' && yytext[i] == '>'))
{
yytext[i] = '\0';
- memmove(yytext, yytext+1, strlen(yytext));
+ memmove(yytext, yytext + 1, strlen(yytext));
}
for (ip = include_paths; yyin == NULL && ip != NULL; ip = ip->next)
@@ -1718,7 +1760,7 @@ parse_include(void)
fprintf(stderr, _("Error: include path \"%s/%s\" is too long on line %d, skipping\n"), ip->path, yytext, yylineno);
continue;
}
- snprintf (inc_file, sizeof(inc_file), "%s/%s", ip->path, yytext);
+ snprintf(inc_file, sizeof(inc_file), "%s/%s", ip->path, yytext);
yyin = fopen(inc_file, "r");
if (!yyin)
{
@@ -1728,10 +1770,14 @@ parse_include(void)
yyin = fopen(inc_file, "r");
}
}
- /* if the command was "include_next" we have to disregard the first hit */
+
+ /*
+ * if the command was "include_next" we have to disregard the
+ * first hit
+ */
if (yyin && include_next)
{
- fclose (yyin);
+ fclose(yyin);
yyin = NULL;
include_next = false;
}
@@ -1741,7 +1787,7 @@ parse_include(void)
mmfatal(NO_INCLUDE_FILE, "could not open include file \"%s\" on line %d", yytext, yylineno);
input_filename = mm_strdup(inc_file);
- yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
+ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
yylineno = 1;
output_line_number();
@@ -1786,7 +1832,7 @@ isdefine(void)
yb = mm_alloc(sizeof(struct _yy_buffer));
- yb->buffer = YY_CURRENT_BUFFER;
+ yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename);
yb->next = yy_buffer;
@@ -1830,7 +1876,7 @@ isinformixdefine(void)
yb = mm_alloc(sizeof(struct _yy_buffer));
- yb->buffer = YY_CURRENT_BUFFER;
+ yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename);
yb->next = yy_buffer;