#include #include #include #include #include "memory.h" #include "parser.h" char* readfile(const char *fname){ FILE *f=fopen(fname,"rb"); if(!f)return NULL; if(fseek(f,0,SEEK_END)==-1){fclose(f); return NULL;} long flen=ftell(f); if(flen==-1){fclose(f); return NULL;} rewind(f); char *buf=malloc(flen+1); if(!buf){fclose(f); return NULL;} fread(buf,1,flen,f); if(ferror(f)){fclose(f); free(buf); return NULL;} if(memchr(buf,'\0',flen)!=NULL){ fprintf(stderr,"Invalid null char in file '%s'\n",fname); exit(1); } buf[flen]='\0'; fclose(f); return buf; } char *readstdin(void){ int bufsz=1024,cursor=0; char *buf=malloc(bufsz); if(!buf)return NULL; while(true){ if(cursor==bufsz-1){ bufsz*=2; char *newbuf=realloc(buf,bufsz); if(!newbuf){ free(buf); return NULL; } buf=newbuf; } int nread=fread(buf,1,bufsz-cursor-1,stdin); if(nread>0&&memchr(buf,'\0',nread)!=NULL){ fprintf(stderr,"Invalid null char on stdin file\n"); exit(1); } cursor+=nread; if(nread\n",argv0); } int main(int argc,char **argv){ if(argc!=2){ usage(argv[0]); return 1; } char *source; if(strcmp(argv[1],"-")==0)source=readstdin(); else source=readfile(argv[1]); if(!source){ fprintf(stderr,"Error reading %s\n",strcmp(argv[1],"-")==0?"from stdin":argv[1]); return 1; } char *errmsg; AST *ast=parse(source,&errmsg); if(ast==NULL){ fprintf(stderr,"%s\n",errmsg); free(errmsg); return 1; } ast_debug(stderr,ast); ast_free(ast); }