Changed INFORMIX mode symbol definition yet again because the old way didn't work...
authorMichael Meskes <meskes@postgresql.org>
Sun, 17 Feb 2008 18:42:23 +0000 (18:42 +0000)
committerMichael Meskes <meskes@postgresql.org>
Sun, 17 Feb 2008 18:42:23 +0000 (18:42 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/include/datetime.h
src/interfaces/ecpg/include/decimal.h
src/interfaces/ecpg/include/ecpg_informix.h
src/interfaces/ecpg/preproc/pgc.l

index 7a2f8346a648928225de68884b6def934ea54643..b73664a4ae2b51cf1d41e43a57cb0ce46707dda1 100644 (file)
@@ -2317,3 +2317,8 @@ Fri, 15 Feb 2008 12:01:13 +0100
 
        - Changed the way symbols are defined in C in INFORMIX mode.
 
+Sun, 17 Feb 2008 18:45:39 +0100
+
+       - Removed duplicate include of ecpgtype.h.
+       - Changed INFORMIX mode symbol definition yet again because the old
+         way didn't work on NetBSD.
index 03f2091db4af900eb34eb538b12b45fc7f96901c..c7d37cb60f8e49de3329877b0172974b5b7c686d 100644 (file)
@@ -5,8 +5,9 @@
 
 #include <ecpg_informix.h>
 
-/* brought in by ecpg_informix.h nowadays
- * typedef timestamp dtime_t;
- * typedef interval intrvl_t; */
+#ifndef _ECPGLIB_H /* source created by ecpg which defines these symbols */
+typedef timestamp dtime_t;
+typedef interval intrvl_t;
+#endif /* ndef _ECPGLIB_H */
 
 #endif   /* ndef _ECPG_DATETIME_H */
index ae185a99c01113d351a4111dc92bd6ba9a5ab7f2..a4d4967fa3764b58e14371b4a615737c4e7d00be 100644 (file)
@@ -5,7 +5,8 @@
 
 #include <ecpg_informix.h>
 
-/* brought in by ecpg_informix.h nowadays
- * typedef decimal dec_t; */
+#ifndef _ECPGLIB_H /* source created by ecpg which defines this symbol */
+typedef decimal dec_t; 
+#endif /* ndef _ECPGLIB_H */
 
 #endif   /* ndef _ECPG_DECIMAL_H */
index 4153896c339e24be32429f8ac908373b77415455..c00914338dcd977fdf06e31fb03ada8a6af9fa1b 100644 (file)
@@ -82,11 +82,6 @@ extern int   dttofmtasc(timestamp *, char *, int, char *);
 extern int     intoasc(interval *, char *);
 extern int     dtcvfmtasc(char *, char *, timestamp *);
 
-/* we also define Informix datatypes here */
-typedef timestamp dtime_t;
-typedef interval intrvl_t;
-typedef decimal dec_t;
-
 #ifdef __cplusplus
 }
 #endif
index 97edc420fb5922b11a3ad2e508331747354169dd..bd0a7d265ed463f7622ffc08ea7f80e6cc3cda16 100644 (file)
@@ -47,6 +47,7 @@ static void addlitchar (unsigned char);
 static void parse_include (void);
 static bool ecpg_isspace(char ch);
 static bool isdefine(void);
+static bool isinformixdefine(void);
 
 char *token_start;
 int state_before;
@@ -743,7 +744,9 @@ cppline                     {space}*#(.*\\{space})*.*{newline}
 <C>{identifier}        {
                                                const ScanKeyword               *keyword;
                                                        
-                                               if (!isdefine())
+                                               /* Informix uses SQL defines only in SQL space */
+                                               /* however, some defines have to be taken care of for compatibility */
+                                               if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine())
                                                {
                                                        keyword = ScanCKeywordLookup(yytext);
                                                        if (keyword != NULL)
@@ -1315,6 +1318,36 @@ static bool isdefine(void)
        return false;
 }
 
+static bool isinformixdefine(void)
+{
+       const char *new = NULL;
+
+       if (strcmp(yytext, "dec_t") == 0)
+               new = "decimal";
+       else if (strcmp(yytext, "intrvl_t") == 0)
+               new = "interval";
+       else if (strcmp(yytext, "dtime_t") == 0)
+                new = "timestamp";
+
+       if (new)
+       {
+               struct _yy_buffer *yb;
+
+               yb = mm_alloc(sizeof(struct _yy_buffer));
+
+               yb->buffer =  YY_CURRENT_BUFFER;
+               yb->lineno = yylineno;
+               yb->filename = mm_strdup(input_filename);
+               yb->next = yy_buffer;
+               yy_buffer = yb;
+
+               yy_scan_string(new);
+               return true;
+       }
+
+       return false;
+}
+
 /*
  * Called before any actual parsing is done
  */