Advertisement
OrenWatson

scrip7.c

Dec 9th, 2014
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.16 KB | None | 0 0
  1. /*scrip7 super unstable release 2014-12-16 23:15
  2. changes hex literals to N%F
  3. changes string literals to hollerith notation
  4. changes loop syntax: [ can be jumped to but does not jump
  5. adds loop target caching.
  6. adds float notation 2.3^4 and fixes bugs in integer and float literals.
  7. added undivide operator and renamed xor operator to X.
  8. added subscripting to vars. ( for char offset, ) for type size offset
  9. */
  10. #include "stdio.h"
  11. #include "stdlib.h"
  12. #include "string.h"
  13. #include "stdint.h"
  14. #include "math.h"
  15. #include "inttypes.h"
  16. #include "stddef.h"
  17. #define ei else if
  18. #define un(x) if(!(x))
  19. #define wh while
  20. #define loop for(;;)
  21. #define let(x,y) typeof(y)x=y
  22. struct va7 {int64_t c;double x;char *p;};
  23. /*Declarations for non-static*/
  24. void scrip7(char *code,void *data);
  25. /*execute string*/
  26. void scrip7f(FILE *code,void *data);
  27. /*execute whole file as a series of programs.*/
  28. int scrip7rc(FILE *code,void *data);
  29. /*execute a program, ending with .\n, returns 0 if the program was empty.*/
  30. void scrip7cli(FILE *code,void *data);
  31. /*execute a set of programs, ending with an empty program.*/
  32.  
  33. static char *s7getcmd(FILE *f){
  34.     int n=80,l=0;
  35.     char *s=NULL,*q;
  36.     loop{
  37.         s=realloc(s,n);
  38.         q=fgets(s+l,n-l,f);
  39.         if(!q)return s;
  40.         l+=strlen(s+l);
  41.         if(s[l-1]=='\n')
  42.         if(s[l-2]=='.'){
  43.             s[l-2]=0;
  44.             return s;
  45.         }
  46.         if(l==n-1)n*=2;
  47.     }
  48. }
  49.  
  50. int undiv(double x,int64_t*np,int64_t*dp){
  51.     double y;int i=0;
  52.     int64_t p=0,q=1,r=1,s=0,n;
  53.     do{i++;if(i>10)break;
  54.     n = (int64_t)((p-x*q)/(x*s-r));
  55.     p += n*r;q += n*s;y = (double)p/q;
  56.     if(y==x){*np=p;*dp=q;return i;}
  57.     n = (int64_t)((r-x*s)/(x*q-p));
  58.     r += n*p;s += n*q;y = (double)r/s;
  59.     }while(y!=x);
  60.     *np=r;*dp=s;return i;
  61. }
  62.  
  63.  
  64. static void memsetl(char *r,char *s,int len,int num){
  65.     memmove(r,s,len);
  66.     int k=1;
  67.     wh(k<num){
  68.         memcpy(r+k*len,r,len*(k*2>num?num-k:k));
  69.         k*=2;
  70.     }
  71. }
  72.  
  73. static char *s7getinput(FILE *f,char b){
  74.     int n=80,l=0;
  75.     char *s=NULL,*q;
  76.     wh(1){
  77.         s=realloc(s,n);
  78.         q=fgets(s+l,n-l,f);
  79.         if(!q)return s;
  80.         l+=strlen(s+l);
  81.         if(s[l-1]==b)return s;
  82.         if(l==n-1)n*=2;
  83.     }
  84. }
  85.  
  86. int s7logflag=0;
  87. int s7freeflag=0;
  88. int s7ioflag=1;
  89. #define TY_INT8 0
  90. #define TY_INT16 1
  91. #define TY_INT32 2
  92. #define TY_INT64 3
  93. #define TY_ADDR 4
  94. #define TY_PTR 5
  95. #define TY_FLOAT 6
  96. #define TY_DOUBLE 7
  97. static char *tpnm[]={"int8","int16","int32","int64","addr","void*","float","double"};
  98. #define VR_AIOU 0
  99. #define VR_BJPV 1
  100. #define VR_CKQW 2
  101. #define VR_DLRX 3
  102. #define VR_EMSY 4
  103. #define VR_FNTZ 5
  104. #define VR_G 6
  105. #define VR_H 7
  106. #define VR_LIT 8
  107. #define VR_VOID 9
  108. static char *vrnm[]={"aiou","bjpv","ckqw","dlrx","emsy","fntz","g","h","constant","voidvar"};
  109. static int tpsz[]={1,2,4,8,1,sizeof(void*),sizeof(float),sizeof(double)};
  110.  
  111. #define Log(mesg,args...) {if(s7logflag)fprintf(stderr,"%ld:"mesg"\n",g-code,##args);}wh(0)
  112. #define Die(mesg,args...) {fprintf(stderr,"%ld:"mesg"\n",g-code,##args);goto hell;}wh(0)
  113.  
  114. static void gettype(char*g,int*d,int *dt){
  115.     if(*g>='a'&&*g<='f')*d=*g-'a',*dt=TY_INT8;
  116.     ei(*g>='A'&&*g<='F')*d=*g-'A',*dt=TY_INT16;
  117.     ei(*g>='i'&&*g<='n')*d=*g-'i',*dt=TY_INT32;
  118.     ei(*g>='I'&&*g<='N')*d=*g-'I',*dt=TY_INT64;
  119.     ei(*g>='o'&&*g<='t')*d=*g-'o',*dt=TY_PTR;
  120.     ei(*g>='O'&&*g<='T')*d=*g-'O',*dt=TY_ADDR;
  121.     ei(*g>='u'&&*g<='z')*d=*g-'u',*dt=TY_FLOAT;
  122.     ei(*g>='U'&&*g<='Z')*d=*g-'U',*dt=TY_DOUBLE;
  123.     ei(*g=='G')*d=VR_G,*dt=TY_ADDR;
  124.     ei(*g=='H')*d=VR_H,*dt=TY_ADDR;
  125.     ei(*g=='g')*d=VR_G,*dt=TY_INT8;
  126.     ei(*g=='h')*d=VR_H,*dt=TY_INT8;
  127.     ei(*g=='_')*d=VR_VOID,*dt=-1;
  128. }
  129.  
  130. static void setval(int dt,char **dp, ptrdiff_t dx, struct va7*v){
  131.     if(dp==0)return;
  132.     if(dt==TY_INT8)(*(int8_t*)(*dp+dx)) = v->c;
  133.     ei(dt==TY_INT16)(*(int16_t*)(*dp+dx)) = v->c;
  134.     ei(dt==TY_INT32)(*(int32_t*)(*dp+dx)) = v->c;
  135.     ei(dt==TY_INT64)(*(int64_t*)(*dp+dx)) = v->c;
  136.     ei(dt==TY_ADDR)(*dp) = v->p-dx;
  137.     ei(dt==TY_PTR)(*(void**)(*dp+dx)) = v->p;
  138.     ei(dt==TY_FLOAT)(*(float*)(*dp+dx)) = v->x;
  139.     ei(dt==TY_DOUBLE)*(double*)(*dp+dx) = v->x;
  140. }
  141.  
  142. static void getval(int st,char **sp, ptrdiff_t sx, struct va7 *v){
  143.     if(!sp)return;
  144.     if(st==TY_INT8)v->c=*(int8_t*)(*sp+sx);
  145.     ei(st==TY_INT16)v->c=*(int16_t*)(*sp+sx);
  146.     ei(st==TY_INT32)v->c=*(int32_t*)(*sp+sx);
  147.     ei(st==TY_INT64)v->c=*(int64_t*)(*sp+sx);
  148.     ei(st==TY_ADDR)v->p=(*sp+sx);
  149.     ei(st==TY_PTR)v->p=*(void**)(*sp+sx);
  150.     ei(st==TY_FLOAT)v->x=*(float*)(*sp+sx);
  151.     ei(st==TY_DOUBLE)v->x=*(double*)(*sp+sx);
  152.     if(st<=TY_INT64){v->p=(*sp+sx);v->x=v->c;}
  153.     ei(st<=TY_PTR){v->c=(int64_t)v->p;v->x=v->c;}
  154.     ei(st<=TY_DOUBLE){v->c=v->x;v->p=(*sp+sx);}
  155. }
  156.  
  157. static int64_t memlen(char *d,struct va7 *s,int t){
  158.     int64_t n=0;
  159.     struct va7 v;
  160.     loop{
  161.         char *q=d+tpsz[t]*n;
  162.         getval(t,&q,0,&v);
  163.         if(t<TY_ADDR&&v.c==s->c)break;
  164.         ei(t<TY_FLOAT&&t>=TY_ADDR&&v.p==s->p)break;
  165.         ei(t<8&&t>=TY_FLOAT&&v.x==s->x)break;
  166.         n++;
  167.     }
  168.     return n;
  169. }
  170.  
  171. #define usg uintptr_t
  172.  
  173. static char *fwdjmptbl[256][2];
  174. static uint8_t bakjmptbl[256];
  175. static int pcache(char **s){
  176.     if(**s=='{'){
  177.         uint8_t k = ((usg)*s)%256;
  178.         if(fwdjmptbl[k][0]==*s){
  179.             *s = fwdjmptbl[k][1]+1;
  180.             return 1;
  181.         }else return 0;
  182.     }
  183.     if(**s=='}'){
  184.         uint8_t k = bakjmptbl[((usg)*s)%256];
  185.         if(fwdjmptbl[k][1]==*s){
  186.             *s = fwdjmptbl[k][0]+1;
  187.             return 1;
  188.         }else return 0;
  189.     }
  190.     return 0;
  191. }
  192.  
  193. static char *skipp(char *s){
  194.     int l=0,nl=0;
  195.     char *ss=s;
  196.     if(*s=='['||*s==']')return s+1;
  197.     un(*s=='{'||*s=='}')return s;
  198.     if(pcache(&s))return s;
  199.     do{
  200.         if(*s=='['||*s=='{')nl=l+1;
  201.         if(*s==']'||*s=='}')nl=l-1;
  202.         if(nl==0){
  203.             if(l>0){
  204.                 fwdjmptbl[((usg)ss)%256][0]=ss;
  205.                 fwdjmptbl[((usg)ss)%256][1]=s;
  206.                 bakjmptbl[((usg)s)%256]=((usg)ss)%256;
  207.                 s++;
  208.             }ei(l<0){
  209.                 fwdjmptbl[((usg)s)%256][0]=s;
  210.                 fwdjmptbl[((usg)s)%256][1]=ss;
  211.                 bakjmptbl[((usg)ss)%256]=((usg)s)%256;
  212.                 s++;
  213.             }
  214.             return s;
  215.         }
  216.         l=nl;
  217.         if(l<0)s--;
  218.         if(l>0)s++;
  219.     }wh(1);
  220. }
  221.  
  222. static void parsenum(char **gp,int *stp,struct va7 *sp){
  223.     int64_t i=0,j;
  224.     double x;
  225.     char *p=0;
  226.     int sgn=1;
  227.     char *g=*gp;
  228.     if(*g>='0'&&*g<='9'){
  229.         wh(*g>='0'&&*g<='9'){
  230.             i=i*10+*g++-'0';
  231.         }
  232.     }else if(*g=='-'){
  233.         sgn = -1;
  234.         g++;
  235.         i=0;
  236.         wh(*g>='0'&&*g<='9'){
  237.             i=i*10-*g+++'0';
  238.         }
  239.     }
  240.     x = i;
  241.     *stp = TY_INT64;
  242.     if(*g=='.'){
  243.         *stp = TY_DOUBLE;
  244.         g++;
  245.         j=0;
  246.         while(*g>='0'&&*g<='9'){
  247.             i=i*10+(*g++-'0')*sgn;
  248.             j++;
  249.         }
  250.         i=x=(double)i/pow(10,j);
  251.         if(*g=='^'){
  252.             g++;
  253.             j=0;
  254.             while(*g>='0'&&*g<='9'){
  255.                 j=j*10+*g-'0';
  256.                 g++;
  257.             }
  258.             x*=pow(10,j);
  259.         }
  260.     }ei(*g=='/'){
  261.         *stp = TY_DOUBLE;
  262.         g++;
  263.         j=0;
  264.         while(*g>='0'&&*g<='9'){
  265.             j=j*10+*g-'0';
  266.             g++;
  267.         }
  268.         i=x=(double)i/j;
  269.     }ei(*g=='%'){
  270.         g++;
  271.         j=0;
  272.         int l=0;
  273.         loop{
  274.             int k=(*g+30)%39;//hex conv hak
  275.             if(k>=16)break;
  276.             j=j*16+k;
  277.             g++;l++;
  278.         }
  279.         int64_t t=j;
  280.         wh(i>0){
  281.             j=(j<<(l*4))+t;
  282.             i--;
  283.         }
  284.         i=j;
  285.         x=i;
  286.     }ei(*g=='"'){
  287.         p=(char*)malloc(i+1);
  288.         p[i]=0;
  289.         for(j=0;j<i;j++){
  290.             p[j]=*++g;
  291.         }
  292.         g++;
  293.         *stp=TY_ADDR;
  294.     }else{
  295.         x=i;
  296.     }
  297.     sp->p = p;
  298.     sp->c = i;
  299.     sp->x = x;
  300.     *gp = g;
  301. }
  302.  
  303. char *s7vars[6];
  304.  
  305. void scrip7(char *code,void *data){
  306.     char **v=s7vars;
  307.     int i;
  308.     if(data)for(i=0;i<6;i++)v[i]=data;
  309.     char *g=code,*h=code;
  310.     int op,d,dt,dx,s,st,sx;
  311.     struct va7 dv,sv;
  312.     wh(*g){
  313.         char*j=skipp(g);
  314.         if(j!=g)Log("skipped parens");
  315.         g=j;
  316.         if(*g=='$'){
  317.             wh(*g&&*g!='#')g++;
  318.             if(*g)g++;
  319.             Log("dollar skips to hash");
  320.             continue;
  321.         }
  322.         if(*g=='`'){Log("backtick is early exit");goto hell;}
  323.         if((*g>0&&*g<=' ')||*g=='#'){g++;continue;}
  324.         un((*g<='Z'&&*g>='A')||(*g<='z'&&*g>='a')||*g=='_')
  325.             Die("bad dest name");
  326.         gettype(g,&d,&dt);
  327.         dx=0;
  328.         sx=0;
  329.         g++;
  330.         wh(*g>0&&*g<=' ')g++;
  331.         if(*g==0)Die("unexpected zero");
  332.         if(*g=='('){
  333.             g++;
  334.             while(*g>='0'&&*g<='9')dx=dx*10+*g++-'0';
  335.         }ei(*g==')'){
  336.             g++;
  337.             while(*g>='0'&&*g<='9')dx=dx*10+(*g++-'0')*tpsz[dt];
  338.         }
  339.         if(*g==0)Die("unexpected zero");
  340.         op=*g;
  341.         g++;
  342.         if(*g==0)Die("unexpected zero");
  343.         if((*g<='z'&&*g>='a')||(*g<='Z'&&*g>='A')){
  344.             gettype(g,&s,&st);
  345.             g++;
  346.             if(*g=='('){
  347.                 g++;
  348.                 while(*g>='0'&&*g<='9')sx=sx*10+*g++-'0';
  349.             }ei(*g==')'){
  350.                 g++;
  351.                 while(*g>='0'&&*g<='9')sx=sx*10+(*g++-'0')*tpsz[st];
  352.             }
  353.         }ei((*g<='9'&&*g>='0')||*g=='.'||*g=='-'||*g=='%'){
  354.             s=8;
  355.             parsenum(&g,&st,&sv);
  356.         }ei(*g=='\''){
  357.             s=8;
  358.             st=TY_INT8;
  359.             g++;
  360.             sv.x=sv.c=*g;
  361.             g++;
  362.         }ei(*g=='{'){
  363.             s=8;
  364.             st=TY_ADDR;
  365.             sv.p=g+1;
  366.             sv.x=sv.c=0;
  367.             g=skipp(g)+1;
  368.         }else Die("bad arg");
  369.         if(dt==-1)dt=st;
  370.         Log("%s %d %s %c %s %d %s",vrnm[d],dx,tpnm[dt],op,vrnm[s],sx,tpnm[st]);
  371.         char **sp=0;
  372.         char *spp;
  373.         if(s<8){
  374.             sp=(s<6)?&(v[s]):(s==6)?&g:&h;
  375.             getval(st,sp,sx,&sv);
  376.         }else{
  377.             spp=(st==TY_ADDR?sv.p:st<4?(char*)&(sv.c):(char*)&(sv.x));
  378.             sp=&spp;
  379.         }
  380.         char **dp=(d<6)?&(v[d]):(d==9)?0:(d==6)?&g:&h;
  381.         getval(dt,dp,dx,&dv);
  382.         int skip=0;
  383.         if(op=='='){
  384.             setval(dt,dp,dx,&sv);
  385.         }ei(op=='z'){
  386.             setval(st,sp,sx,&dv);
  387.             setval(dt,dp,dx,&sv);
  388.         }ei(s7ioflag&&op=='p'){
  389.             if(dt<=TY_INT64)printf("%"PRId64"\n",(sv.c));
  390.             ei(dt<=TY_PTR)printf("%p\n",(sv.p));
  391.             else printf("%f\n",(sv.x));
  392.             setval(dt,dp,dx,&sv);
  393.         }ei(s7ioflag&&op=='x'){
  394.             if(dt==TY_INT8)printf("%02"PRIx8"\n",(uint8_t)(sv.c));
  395.             ei(dt==TY_INT16)printf("%04"PRIx16"\n",(uint16_t)(sv.c));
  396.             ei(dt==TY_INT32)printf("%08"PRIx32"\n",(uint32_t)(sv.c));
  397.             ei(dt==TY_INT64)printf("%016"PRIx64"\n",(sv.c));
  398.             ei(dt<=TY_PTR)printf("%p\n",(sv.p));
  399.             else{
  400.                 int64_t n,d;
  401.                 undiv(sv.x,&n,&d);
  402.                 printf("%"PRId64"/%"PRId64"\n",n,d);
  403.             }
  404.             setval(dt,dp,dx,&sv);
  405.         }ei(s7ioflag&&op=='r'){
  406.             char *r=s7getinput(stdin,'\n');
  407.             if(dt<=TY_INT64)dv.c=strtol(r,0,0);
  408.             ei(dt==TY_FLOAT||dt==TY_DOUBLE)dv.x=strtod(r,0);
  409.             free(r);
  410.             setval(dt,dp,dx,&dv);
  411.         }ei(s7ioflag&&op=='G'){
  412.             dv.p=s7getinput(stdin,sv.c);
  413.             setval(TY_ADDR,dp,dx,&dv);
  414.         }ei(op=='S'){
  415.             char *r=*dp;
  416.             struct va7 nv;
  417.             getval(TY_INT64,&v[5],0,&nv);
  418.             if(st==TY_PTR||st==TY_ADDR){
  419.                 memmove(r,*sp,nv.c*tpsz[dt]);
  420.             }else{
  421.                 memsetl(r,*sp,tpsz[st],nv.c);
  422.             }
  423.         }ei(op=='L'){
  424.             struct va7 nv;
  425.             nv.c = memlen(*dp,&sv,dt);
  426.             setval(TY_INT64,v+5,0,&nv);
  427.         }ei(op=='\\'){
  428.             int64_t n,d;
  429.             undiv(sv.x,&n,&d);
  430.             dv.x=dv.c = n;
  431.             setval(dt,dp,dx,&dv);
  432.             dv.x=dv.c = d;
  433.             *dp = *dp + tpsz[dt];
  434.             setval(dt,dp,dx,&dv);
  435.             *dp = *dp - tpsz[dt];
  436.         }ei(s7ioflag&&op=='R'){
  437.             if(0>=fread(*dp,tpsz[dt],sv.c,stdin))
  438.                 Log("Read Failed. Ignoring.\n");
  439.         }ei(s7ioflag&&op=='W'){
  440.             fwrite(*dp,tpsz[dt],sv.c,stdout);
  441.         }ei(s7ioflag&&op=='.'){
  442.             putchar(sv.c);
  443.             setval(dt,dp,dx,&sv);
  444.         }ei(s7ioflag&&op==','){
  445.             dv.x=dv.c=getchar();
  446.             setval(dt,dp,dx,&dv);
  447.         }ei(op=='+'){
  448.             dv.c+=sv.c;
  449.             dv.x+=sv.x;
  450.             dv.p+=sv.c;
  451.             setval(dt,dp,dx,&dv);
  452.         }ei(op=='-'){
  453.             dv.c-=sv.c;
  454.             dv.x-=sv.x;
  455.             dv.p-=sv.c;
  456.             setval(dt,dp,dx,&dv);
  457.         }ei(op=='/'){
  458.             dv.c/=sv.c;
  459.             dv.x/=sv.x;
  460.             setval(dt,dp,dx,&dv);
  461.         }ei(op=='%'){
  462.             dv.c%=sv.c;
  463.             dv.x=fmod(dv.x,sv.x);
  464.             setval(dt,dp,dx,&dv);
  465.         }ei(op=='*'){
  466.             dv.c*=sv.c;
  467.             dv.x*=dv.x;
  468.             setval(dt,dp,dx,&dv);
  469.         }ei(op=='|'){
  470.             dv.c|=sv.c;
  471.             setval(dt,dp,dx,&dv);
  472.         }ei(op=='&'){
  473.             dv.c&=sv.c;
  474.             setval(dt,dp,dx,&dv);
  475.         }ei(op=='^'){
  476.             dv.c=pow(dv.c,sv.x);
  477.             dv.x=pow(dv.x,sv.x);
  478.             setval(dt,dp,dx,&dv);
  479.         }ei(op=='c'){
  480.             dv.c=dv.x=dv.x*cos(sv.x);
  481.             setval(dt,dp,dx,&dv);
  482.         }ei(op=='s'){
  483.             dv.c=dv.x=dv.x*tan(sv.x);
  484.             setval(dt,dp,dx,&dv);
  485.         }ei(op=='_'){
  486.             dv.c=dv.x=dv.x*log(sv.x);
  487.             setval(dt,dp,dx,&dv);
  488.         }ei(op=='t'){
  489.             dv.c=dv.x=dv.x*tan(sv.x);
  490.             setval(dt,dp,dx,&dv);
  491.         }ei(op=='a'){
  492.             dv.c=dv.x=atan2(dv.x,sv.x);
  493.             setval(dt,dp,dx,&dv);
  494.         }ei(op=='e'){
  495.             dv.c=dv.x=dv.x*exp(sv.x);
  496.             setval(dt,dp,dx,&dv);
  497.         }ei(op=='X'){
  498.             dv.c^=sv.c;
  499.             setval(dt,dp,dx,&dv);
  500.         }ei(op=='M'){
  501.             *dp=malloc(sv.c*tpsz[dt]);
  502.         }ei(op=='N'){
  503.             *dp=realloc(*dp,sv.c*tpsz[dt]);
  504.         }ei(op=='>'){
  505.             *dp=*dp+(sv.c*tpsz[dt]);
  506.         }ei(op==':'){
  507.             setval(dt,dp,dx,&sv);
  508.             *dp=*dp+tpsz[dt];
  509.         }ei(op==';'){
  510.             *dp=*dp-tpsz[dt];
  511.             setval(dt,dp,dx,&sv);
  512.         }ei(op=='<'){
  513.             *dp=*dp-(sv.c*tpsz[dt]);
  514.         }ei(op=='F'){
  515.             free(*dp);
  516.             *dp=data;
  517.         }ei(op=='~'){
  518.             if(dt<=TY_INT64)skip=(dv.c!=sv.c);
  519.             ei(dt<=TY_PTR)skip=(dv.p!=sv.p);
  520.             else skip=(dv.x!=sv.x);
  521.         }ei(op=='g'){
  522.             if(dt<=TY_INT64)skip=(dv.c<=sv.c);
  523.             ei(dt<=TY_PTR)skip=(dv.p<=sv.p);
  524.             else skip=(dv.x<=sv.x);
  525.         }ei(op=='l'){
  526.             if(dt<=TY_INT64)skip=(dv.c>=sv.c);
  527.             ei(dt<=TY_PTR)skip=(dv.p>=sv.p);
  528.             else skip=(dv.x>=sv.x);
  529.         }ei(op=='!'){
  530.             if(dt<=TY_INT64)skip=(dv.c==sv.c);
  531.             ei(dt<=TY_PTR)skip=(dv.p==sv.p);
  532.             else skip=(dv.x==sv.x);
  533.         }
  534.         if(skip){
  535.             Log("condition false, skipping");
  536.             wh(*g&&*g!='#')g++;
  537.             if(*g)g++;
  538.         }
  539.     }
  540.     hell:
  541.     Log("end");
  542. }
  543.  
  544. int scrip7rc(FILE *in,void*data){
  545.     char *cmd=s7getcmd(in);
  546.     if(*cmd==0){free(cmd);return 0;}
  547.     scrip7(cmd,data);
  548.     if(s7freeflag)free(cmd);
  549.     return 1;
  550. }
  551.  
  552. void scrip7f(FILE *f,void*data){
  553.     wh(!feof(f))scrip7rc(f,data);
  554. }
  555.  
  556. void scrip7cli(FILE *in,void*data){
  557.     wh(!feof(in)&&scrip7rc(in,data));
  558. }
  559.  
  560. #ifndef NOS7MAIN
  561. __attribute__((weak)) int main(int argc,char **argv){
  562.     char *data=malloc(1000);
  563.     int i=argc,cli=(i==1);
  564.     wh(i>1){
  565.         i--;
  566.         FILE *f=fopen(argv[i],"r");
  567.         if(!f){
  568.             if(strchr(argv[i],'d'))s7logflag=1;
  569.             if(strchr(argv[i],'f'))s7freeflag=1;
  570.             if(strchr(argv[i],'c'))cli=1;
  571.             continue;
  572.         }
  573.         scrip7f(f,data);
  574.         fclose(f);
  575.     }
  576.     if(cli)scrip7cli(stdin,data);
  577.     return 0;
  578. }
  579. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement