diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 81 |
1 files changed, 81 insertions, 0 deletions
@@ -0,0 +1,81 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include <assert.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<bufsz-cursor-1){ + if(feof(stdin))break; + if(ferror(stdin)){ + free(buf); + return NULL; + } + } + } + buf[cursor]='\0'; + return buf; +} + + +void usage(const char *argv0){ + fprintf(stderr,"Usage: %s <source file>\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; + } + + ; +} |