4 * Read DLL Binder definition files
6 * © 1994-1998 Straylight
9 /*----- Licensing note ----------------------------------------------------*
11 * This file is part of Straylight's Dynamic Linking System (SDLS)
13 * SDLS is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2, or (at your option)
18 * SDLS is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with SDLS. If not, write to the Free Software Foundation,
25 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
33 #include "hashtable.h"
41 static char *readdef_token=0;
43 static void addChar(char **buffer,int *length,int *size,char c)
48 if (p=realloc(*buffer,*size+CHUNKSIZE),!p)
53 (*buffer)[(*length)++]=c;
56 #define add(c) addChar(&readdef_token,&len,&size,(c))
58 int cistrcmp(const char *s1,const char *s2)
84 static char readdef__ungot[2];
85 static int readdef__ungotc=0;
87 #define GET(fp) (readdef__ungotc ? \
88 readdef__ungot[--readdef__ungotc] : \
91 #define UNGET(c) ((void)((c)==EOF ? \
93 (readdef__ungot[readdef__ungotc++]=(c))))
95 static int readdef__getToken(FILE *fp)
109 /* --- Skip whitespace --- */
110 while (isspace(ch=GET(fp)))
118 while (ch=GET(fp),ch!='\n' && ch!=EOF)
125 while (ch=GET(fp),ch!='*' ||
126 (ch=GET(fp),UNGET(ch),ch!='/'))
131 while (ch=GET(fp),ch!='\n' && ch!=EOF)
183 while (ch=GET(fp),ch!=EOF && !isspace(ch))
194 static char *readdef__tokAsString(int type)
207 return ("<integer>");
209 return ("<string literal>");
211 return (readdef_token);
216 static int readdef__getOrderedTable(FILE *fp,hashtable h)
223 switch (tok=readdef__getToken(fp))
228 error(JUNKNOBRA,readdef__tokAsString(tok));
233 tok=readdef__getToken(fp);
241 tok=readdef__getToken(fp);
245 tok=readdef__getToken(fp);
248 sscanf(readdef_token,"%i",&ord);
249 tok=readdef__getToken(fp);
252 if (!hash_addWithOrd(h,name,ord))
263 error(JUNKNOKET,readdef__tokAsString(tok));
270 static int readdef__getTable(FILE *fp,hashtable h)
275 switch (tok=readdef__getToken(fp))
280 error(JUNKNOBRA,readdef__tokAsString(tok));
287 switch (tok=readdef__getToken(fp))
290 if (!hash_add(h,readdef_token))
300 error(JUNKNOKET,readdef__tokAsString(tok));
307 static int readdef__getVersion(FILE *fp,int *v)
314 switch (tok=readdef__getToken(fp))
317 dot=strchr(readdef_token,'.');
320 sscanf(readdef_token,"%i",&major);
326 major=atoi(readdef_token);
327 switch (strlen(dot+1))
334 *v=major*100+minor*10;
341 error(BADVER,readdef__tokAsString(tok));
347 error(JUNKNOVER,readdef__tokAsString(tok));
353 static int readdef__getName(FILE *fp,char *name)
357 switch (tok=readdef__getToken(fp))
361 strcpy(name,readdef_token);
364 error(JUNKNONAME,readdef__tokAsString(tok));
370 static int readdef__getCopyright(FILE *fp,char *name)
375 switch (tok=readdef__getToken(fp))
379 _swi(OS_Word,_inr(0,1),14,timeBuff);
380 _swi(OS_ConvertDateAndTime,_inr(0,3),timeBuff,name,256,readdef_token);
383 error(JUNKNOCRIGHT,readdef__tokAsString(tok));
389 static int readdef__getItem(FILE *fp,readdef_info *info)
393 switch (tok=readdef__getToken(fp))
401 error(JUNKNOITEM,readdef__tokAsString(tok));
405 if (!cistrcmp(readdef_token,"exports"))
406 return (readdef__getOrderedTable(fp,info->sym));
407 else if (!cistrcmp(readdef_token,"extentry"))
408 return (readdef__getTable(fp,info->vsym));
409 else if (!cistrcmp(readdef_token,"objects"))
410 return (readdef__getTable(fp,info->obj));
411 else if (!cistrcmp(readdef_token,"version"))
412 return (readdef__getVersion(fp,&info->version));
413 else if (!cistrcmp(readdef_token,"name"))
414 return (readdef__getName(fp,info->name));
415 else if (!cistrcmp(readdef_token,"author"))
416 return (readdef__getCopyright(fp,info->copyright));
417 else if (!cistrcmp(readdef_token,"NonAPCS"))
419 info->flags|=rdFlag_shortEntry;
422 else if (!cistrcmp(readdef_token,"OmitNames"))
424 info->flags|=rdFlag_noNames;
429 error(BADITEM,readdef_token);
434 int readdef(char *file,readdef_info *info)
436 FILE *fp=fopen(file,"r");
440 error(NOOPENIN,file);
450 while (readdef__getItem(fp,info)!=-1)