1 /* 2 * Copyright (C) YEAR The GNOME Foundation 3 * 4 * AUTHORS: 5 * TO_ADD: your name and email 6 * Vivien Malerba <malerba@gnome-db.org> 7 * 8 * This Library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public License as 10 * published by the Free Software Foundation; either version 2 of the 11 * License, or (at your option) any later version. 12 * 13 * This Library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public 19 * License along with this Library; see the file COPYING.LIB. If not, 20 * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301, USA. 22 */ 23 24 /* 25 * This program generates tokens'ID transformation because the GdaSqlParser object uses 2 Lemon generated 26 * parsers at once, but with only one tokenizer (because each Lemon generated parser generates it own IDs for 27 * tokens). 28 */ 29 30 #include <stdio.h> 31 #include <string.h> 32 #include <stdlib.h> 33 #include <stdio.h> 34 #include <errno.h> 35 36 #define MAX_SYMBOLS 500 37 #define PARSER_HEADER "parser.h" 38 #define FALSE 0 39 #define TRUE (!FALSE) 40 41 typedef struct { 42 char *key; 43 int parser_value; 44 } HashEntry; 45 46 HashEntry entries[MAX_SYMBOLS]; 47 int nb_entries; /* must remain < MAX_SYMBOLS */ 48 49 typedef enum { 50 TYPE_IMPOSED, 51 TYPE_PARSER 52 } SourceType; 53 54 static void parse_contents (FILE *stream, SourceType type); 55 static HashEntry *find_entry_for_token (char *token); 56 int 57 main (int argc,char** argv) 58 { 59 int i; 60 FILE *fd_imposed; 61 FILE *fd_parser; 62 HashEntry *illegal_entry; 63 64 memset (entries, 0, sizeof (entries)); 65 /* printf ("Imposed header: %s\n", IMPOSED_HEADER); */ 66 fd_imposed = fopen (IMPOSED_HEADER, "r"); 67 if (!fd_imposed) { 68 printf ("Can't open '%s':%s\n", IMPOSED_HEADER, strerror (errno)); 69 return 1; 70 } 71 /* printf ("Parser header: %s\n", PARSER_HEADER); */ 72 fd_parser = fopen (PARSER_HEADER, "r"); 73 if (!fd_parser) { 74 printf ("Can't open '%s':%s\n", PARSER_HEADER, strerror (errno)); 75 return 1; 76 } 77 78 nb_entries = 0; 79 parse_contents (fd_imposed, TYPE_IMPOSED); 80 parse_contents (fd_parser, TYPE_PARSER); 81 82 fclose (fd_imposed); 83 fclose (fd_parser); 84 85 /* output notice */ 86 printf ("/*\n * This file is generated by the gen_def program (see the gen_def.c file \n" 87 " * for some explanations)\n" 88 " * DO NOT EDIT MANUALLY\n */\n\n\n"); 89 90 /* output */ 91 illegal_entry = find_entry_for_token ("ILLEGAL"); 92 printf ("gint capi_parser_tokens[] = {\n"); 93 for (i = 0; i < nb_entries; i++) { 94 HashEntry *entry = &(entries[i]); 95 if (i!= 0) 96 printf (",\n"); 97 if (entry->parser_value >= 0) 98 printf ("/* %03d */ %d", i, entry->parser_value); 99 else 100 printf ("/* %03d */ %d", i, illegal_entry->parser_value); 101 } 102 printf ("};\n"); 103 104 return 0; 105 } 106 107 static HashEntry * 108 find_entry_for_token (char *token) 109 { 110 int i; 111 112 for (i = 0; i < nb_entries; i++) { 113 HashEntry *e = &(entries[i]); 114 if (!strcmp (e->key, token)) 115 return e; 116 } 117 return NULL; 118 } 119 120 121 122 static void 123 parse_line (char *line, SourceType type) 124 { 125 char *z, *token; 126 int value; 127 HashEntry *entry; 128 129 z = line; 130 if (strncmp (z, "#define ", 8)) 131 return; 132 z += 8; 133 token = z + 2; 134 for (; *z && *z != ' '; z++); 135 *z = 0; 136 z++; 137 for (; *z == ' '; z++); 138 value = atoi (z); 139 /* printf ("%d Token: /%s/, value=%d\n", type, token, value); */ 140 141 entry = find_entry_for_token (token); 142 if (!entry) { 143 nb_entries++; 144 entry = &(entries[nb_entries - 1]); 145 entry->key = malloc (sizeof (char) * (strlen (token) + 1)); 146 memcpy (entry->key, token, strlen (token) + 1); 147 entry->parser_value = -1; 148 } 149 if (type == TYPE_PARSER) 150 entry->parser_value = value; 151 } 152 153 static void 154 parse_contents (FILE *stream, SourceType type) 155 { 156 #define BUFSIZE 500 157 char buffer[BUFSIZE]; 158 int read; 159 char *end; 160 161 read = fread (buffer, 1, BUFSIZE, stream); 162 end = buffer + read; 163 while (read > 0) { 164 char *ptr; 165 166 /* read all complete lines in buffer */ 167 while (end > buffer) { 168 char *hold = NULL; 169 for (ptr = buffer; (ptr < end) && *ptr && (*ptr != '\n'); ptr++); 170 if (ptr == end) 171 break; 172 if (*ptr) 173 hold = ptr+1; 174 *ptr = 0; 175 176 /* treat the line */ 177 parse_line (buffer, type); 178 179 if (hold) { 180 int l = end - hold; 181 end -= hold - buffer; 182 memmove (buffer, hold, l); 183 } 184 else 185 break; 186 } 187 188 read = fread (end, 1, BUFSIZE - (end - buffer), stream); 189 end += read; 190 } 191 } 192 193