Advertisement
OrenWatson

scrip7.c

Dec 17th, 2014
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.84 KB | None | 0 0
  1. #if 0
  2. echo "Compiling binaries and extracting doc and test..."
  3. cc $0 -lm -o scrip7
  4. cc -DNOS7MAIN $0 -c -lm -o scrip7.o
  5. cpp $0 -DDOCS -P >docs.txt
  6. cpp $0 -DTEST -P >test.sh
  7. cc -DS7IDE $0 -lm -lncurses -o s7ide
  8. bash test.sh
  9. exit 0
  10. #endif
  11. #ifdef DOCS
  12. Scrip7 hopefully getting stabler release 2014-12-17 06:30
  13. You can extract and compile the full distribution simply by running this
  14. file as a shell script: sh scrip7.c
  15. To compile the simple interpreter, run a command like this:
  16. cc scrip7.c -lm -o scrip7
  17. To include, define INTERFACE and then include this file. If your platform
  18. does not support weak symbols, you will also need to define NOS7MAIN when
  19. compiling the library.
  20. To get this documentation alone, run the following command:
  21. cpp scrip7.c -DDOCS -P >docs.txt
  22. This release includes a rough prototype of the Scrip7 advanced IDE/REPL. To
  23. compile it, run a command similar to this:
  24. cc -DS7IDE scrip7.c -lm -lncurses -o s7ide
  25. Changes to the language in this new version:
  26. none
  27. Changes to the IDE in this new version:
  28. Made this file self-compiling.
  29. #elif defined(TEST)
  30. echo "Running test:"
  31. ./scrip7 >output <<END
  32. I=260I%170I+8I*9I/2I-5_pI {checks arithmetic}
  33. I=7%7f I&6%e0 I|3%01 IX7%0f _xI {checks bit operations}
  34. I=5I^5_pII=3I^4_pI {checks exponentiation}
  35. u=43/8_xi {basic check for ieee float}
  36. U=35478/256_xI {basic check for ieee double}
  37. U=355/113_pU {check real number output}
  38. I=1J>1[J+II+JIl1000}#_pI {check basic looping}
  39. I=%0a53545556575859 [_.aa>1O!P}# {check character output and byte order}
  40. X=4.5325_pX_xXJ\X_pJJ>1_pJ {check float literals and output some more,and undivide}
  41. I=-99_pI {check negative integer literals}
  42. J<2J:23J:17J:27J:67J:44
  43. {Now a test of insertion sort}
  44. [O=RQ=R[IlKQ=O#I>1O!P}#KzLL>1R!P}#
  45. O=SP=SQ=SR=S
  46. _pII>1_pII>1_pII>1_pII>1_pI
  47. END
  48. tr -d '\015' <output >out
  49. if diff out - <<END
  50. 436
  51. 0f6f6f6f6e6e6e6e
  52. 3125
  53. 81
  54. 40ac0000
  55. 406152c000000000
  56. 3.141593
  57. 1597
  58. YXWVUTS
  59. 4.532500
  60. 1813/400
  61. 1813
  62. 400
  63. -99
  64. 17
  65. 23
  66. 27
  67. 44
  68. 67
  69. END
  70. then
  71. echo "Success"
  72. else
  73. echo "Failure"
  74. fi
  75. #else
  76. #include "stdio.h"
  77. //FILE *s7in;
  78. //FILE *s7out;
  79. extern int s7logflag,s7freeflag,s7ioflag,s7errflag;
  80. /*Declarations for non-static*/
  81. void scrip7(char *code,void *data);
  82. /*execute string*/
  83. void scrip7f(FILE *code,void *data);
  84. /*execute whole file as a series of programs.*/
  85. int scrip7rc(FILE *code,void *data);
  86. /*execute a program, ending with .\n, returns 0 if the program was empty.*/
  87. void scrip7cli(FILE *code,void *data);
  88. /*execute a set of programs, ending with an empty program.*/
  89. struct scrip7state{
  90.     char *v[6];
  91.     char *data;
  92. }globa7;
  93.  
  94. #ifndef INTERFACE
  95.  
  96. int s7logflag=0;
  97. int s7freeflag=0;
  98. int s7ioflag=1;
  99. int s7errflag=1;
  100.  
  101. #include "stdlib.h"
  102. #include "string.h"
  103. #include "stdint.h"
  104. #include "math.h"
  105. #include "inttypes.h"
  106. #include "stddef.h"
  107. #define ei else if
  108. #define un(x) if(!(x))
  109. #define wh while
  110. #define loop for(;;)
  111. #define let(x,y) typeof(y)x=y
  112.  
  113. struct va7 {int64_t c;double x;char *p;};
  114.  
  115. static char *s7getcmd(FILE *f){
  116.     int n=80,l=0;
  117.     char *s=NULL,*q;
  118.     loop{
  119.         s=realloc(s,n);
  120.         q=fgets(s+l,n-l,f);
  121.         if(!q)return s;
  122.         l+=strlen(s+l);
  123.         if(s[l-1]=='\n')
  124.         if(s[l-2]=='.'){
  125.             s[l-2]=0;
  126.             return s;
  127.         }
  128.         if(l==n-1)n*=2;
  129.     }
  130. }
  131.  
  132. int undiv(double x,int64_t*np,int64_t*dp){
  133.     double y;int i=0;
  134.     int64_t p=0,q=1,r=1,s=0,n;
  135.     do{i++;if(i>10)break;
  136.     n = (int64_t)((p-x*q)/(x*s-r));
  137.     p += n*r;q += n*s;y = (double)p/q;
  138.     if(y==x){*np=p;*dp=q;return i;}
  139.     n = (int64_t)((r-x*s)/(x*q-p));
  140.     r += n*p;s += n*q;y = (double)r/s;
  141.     }while(y!=x);
  142.     *np=r;*dp=s;return i;
  143. }
  144.  
  145.  
  146. static void memsetl(char *r,char *s,int len,int num){
  147.     memmove(r,s,len);
  148.     int k=1;
  149.     wh(k<num){
  150.         memcpy(r+k*len,r,len*(k*2>num?num-k:k));
  151.         k*=2;
  152.     }
  153. }
  154.  
  155. static char *s7getinput(FILE *f,char b){
  156.     int n=80,l=0;
  157.     char *s=NULL,*q;
  158.     wh(1){
  159.         s=realloc(s,n);
  160.         q=fgets(s+l,n-l,f);
  161.         if(!q)return s;
  162.         l+=strlen(s+l);
  163.         if(s[l-1]==b)return s;
  164.         if(l==n-1)n*=2;
  165.     }
  166. }
  167.  
  168. #define TY_INT8 0
  169. #define TY_INT16 1
  170. #define TY_INT32 2
  171. #define TY_INT64 3
  172. #define TY_ADDR 4
  173. #define TY_PTR 5
  174. #define TY_FLOAT 6
  175. #define TY_DOUBLE 7
  176. static char *tpnm[]={"int8","int16","int32","int64","addr","void*","float","double"};
  177. #define VR_AIOU 0
  178. #define VR_BJPV 1
  179. #define VR_CKQW 2
  180. #define VR_DLRX 3
  181. #define VR_EMSY 4
  182. #define VR_FNTZ 5
  183. #define VR_G 6
  184. #define VR_H 7
  185. #define VR_LIT 8
  186. #define VR_VOID 9
  187. static char *vrnm[]={"aiou","bjpv","ckqw","dlrx","emsy","fntz","g","h","constant","voidvar"};
  188. static int tpsz[]={1,2,4,8,1,sizeof(void*),sizeof(float),sizeof(double)};
  189.  
  190. #define Log(mesg,args...) {if(s7logflag)fprintf(stderr,"%ld:"mesg"\r\n",g-code,##args);}wh(0)
  191. #define Die(mesg,args...) {if(s7errflag)fprintf(stderr,"%ld:"mesg"\r\n",g-code,##args);goto hell;}wh(0)
  192.  
  193. static void gettype(char*g,int*d,int *dt){
  194.     if(*g>='a'&&*g<='f')*d=*g-'a',*dt=TY_INT8;
  195.     ei(*g>='A'&&*g<='F')*d=*g-'A',*dt=TY_INT16;
  196.     ei(*g>='i'&&*g<='n')*d=*g-'i',*dt=TY_INT32;
  197.     ei(*g>='I'&&*g<='N')*d=*g-'I',*dt=TY_INT64;
  198.     ei(*g>='o'&&*g<='t')*d=*g-'o',*dt=TY_PTR;
  199.     ei(*g>='O'&&*g<='T')*d=*g-'O',*dt=TY_ADDR;
  200.     ei(*g>='u'&&*g<='z')*d=*g-'u',*dt=TY_FLOAT;
  201.     ei(*g>='U'&&*g<='Z')*d=*g-'U',*dt=TY_DOUBLE;
  202.     ei(*g=='G')*d=VR_G,*dt=TY_ADDR;
  203.     ei(*g=='H')*d=VR_H,*dt=TY_ADDR;
  204.     ei(*g=='g')*d=VR_G,*dt=TY_INT8;
  205.     ei(*g=='h')*d=VR_H,*dt=TY_INT8;
  206.     ei(*g=='_')*d=VR_VOID,*dt=-1;
  207. }
  208.  
  209. static void setval(int dt,char **dp, ptrdiff_t dx, struct va7*v){
  210.     if(dp==0)return;
  211.     if(dt==TY_INT8)(*(int8_t*)(*dp+dx)) = v->c;
  212.     ei(dt==TY_INT16)(*(int16_t*)(*dp+dx)) = v->c;
  213.     ei(dt==TY_INT32)(*(int32_t*)(*dp+dx)) = v->c;
  214.     ei(dt==TY_INT64)(*(int64_t*)(*dp+dx)) = v->c;
  215.     ei(dt==TY_ADDR)(*dp) = v->p-dx;
  216.     ei(dt==TY_PTR)(*(void**)(*dp+dx)) = v->p;
  217.     ei(dt==TY_FLOAT)(*(float*)(*dp+dx)) = v->x;
  218.     ei(dt==TY_DOUBLE)*(double*)(*dp+dx) = v->x;
  219. }
  220.  
  221. static void getval(int st,char **sp, ptrdiff_t sx, struct va7 *v){
  222.     if(!sp)return;
  223.     if(st==TY_INT8)v->c=*(int8_t*)(*sp+sx);
  224.     ei(st==TY_INT16)v->c=*(int16_t*)(*sp+sx);
  225.     ei(st==TY_INT32)v->c=*(int32_t*)(*sp+sx);
  226.     ei(st==TY_INT64)v->c=*(int64_t*)(*sp+sx);
  227.     ei(st==TY_ADDR)v->p=(*sp+sx);
  228.     ei(st==TY_PTR)v->p=*(void**)(*sp+sx);
  229.     ei(st==TY_FLOAT)v->x=*(float*)(*sp+sx);
  230.     ei(st==TY_DOUBLE)v->x=*(double*)(*sp+sx);
  231.     if(st<=TY_INT64){v->p=(*sp+sx);v->x=v->c;}
  232.     ei(st<=TY_PTR){v->c=(int64_t)v->p;v->x=v->c;}
  233.     ei(st<=TY_DOUBLE){v->c=v->x;v->p=(*sp+sx);}
  234. }
  235.  
  236. static int64_t memlen(char *d,struct va7 *s,int t){
  237.     int64_t n=0;
  238.     struct va7 v;
  239.     loop{
  240.         char *q=d+tpsz[t]*n;
  241.         getval(t,&q,0,&v);
  242.         if(t<TY_ADDR&&v.c==s->c)break;
  243.         ei(t<TY_FLOAT&&t>=TY_ADDR&&v.p==s->p)break;
  244.         ei(t<8&&t>=TY_FLOAT&&v.x==s->x)break;
  245.         n++;
  246.     }
  247.     return n;
  248. }
  249.  
  250. #define usg uintptr_t
  251.  
  252. static char *fwdjmptbl[256][2];
  253. static uint8_t bakjmptbl[256];
  254. static int pcache(char **s){
  255.     if(**s=='{'){
  256.         uint8_t k = ((usg)*s)%256;
  257.         if(fwdjmptbl[k][0]==*s){
  258.             *s = fwdjmptbl[k][1]+1;
  259.             return 1;
  260.         }else return 0;
  261.     }
  262.     if(**s=='}'){
  263.         uint8_t k = bakjmptbl[((usg)*s)%256];
  264.         if(fwdjmptbl[k][1]==*s){
  265.             *s = fwdjmptbl[k][0]+1;
  266.             return 1;
  267.         }else return 0;
  268.     }
  269.     return 0;
  270. }
  271.  
  272. static char *skipp(char *s){
  273.     int l=0,nl=0;
  274.     char *ss=s;
  275.     if(*s=='['||*s==']')return s+1;
  276.     un(*s=='{'||*s=='}')return s;
  277.     if(pcache(&s))return s;
  278.     do{
  279.         if(*s=='['||*s=='{')nl=l+1;
  280.         if(*s==']'||*s=='}')nl=l-1;
  281.         if(nl==0){
  282.             if(l>0){
  283.                 fwdjmptbl[((usg)ss)%256][0]=ss;
  284.                 fwdjmptbl[((usg)ss)%256][1]=s;
  285.                 bakjmptbl[((usg)s)%256]=((usg)ss)%256;
  286.                 s++;
  287.             }ei(l<0){
  288.                 fwdjmptbl[((usg)s)%256][0]=s;
  289.                 fwdjmptbl[((usg)s)%256][1]=ss;
  290.                 bakjmptbl[((usg)ss)%256]=((usg)s)%256;
  291.                 s++;
  292.             }
  293.             return s;
  294.         }
  295.         l=nl;
  296.         if(l<0)s--;
  297.         if(l>0)s++;
  298.     }wh(1);
  299. }
  300.  
  301. static int64_t parsedec(char **gp){
  302.     int64_t i=0;
  303.     wh(**gp>='0'&&**gp<='9'){
  304.         i=i*10+*(*gp)++-'0';
  305.     }
  306.     return i;
  307. }
  308.  
  309. static void parsenum(char **gp,int *stp,struct va7 *sp){
  310.     int64_t i=0,j;
  311.     double x;
  312.     char *p=0;
  313.     int sgn=1;
  314.     char *g=*gp;
  315.     if(*g>='0'&&*g<='9'){
  316.         i=parsedec(&g);
  317.     }else if(*g=='-'){
  318.         sgn = -1;
  319.         g++;
  320.         i=-parsedec(&g);
  321.     }
  322.     x = i;
  323.     *stp = TY_INT64;
  324.     if(*g=='.'){
  325.         *stp = TY_DOUBLE;
  326.         g++;
  327.         j=0;
  328.         while(*g>='0'&&*g<='9'){
  329.             i=i*10+(*g++-'0')*sgn;
  330.             j++;
  331.         }
  332.         i=x=(double)i/pow(10,j);
  333.         if(*g=='^'){
  334.             g++;
  335.             j=parsedec(&g);
  336.             x*=pow(10,j);
  337.         }
  338.     }ei(*g=='/'){
  339.         *stp = TY_DOUBLE;
  340.         g++;
  341.         j=parsedec(&g);
  342.         i=x=(double)i/j;
  343.     }ei(*g=='%'){
  344.         g++;
  345.         j=0;
  346.         int l=0;
  347.         loop{
  348.             int k=(*g+30)%39;//hex conv hak
  349.             if(k>=16)break;
  350.             j=j*16+k;
  351.             g++;l++;
  352.         }
  353.         int64_t t=j;
  354.         wh(i>0){
  355.             j=(j<<(l*4))+t;
  356.             i--;
  357.         }
  358.         i=j;
  359.         x=i;
  360.     }ei(*g=='"'){
  361.         p=(char*)malloc(i+1);
  362.         p[i]=0;
  363.         for(j=0;j<i;j++){
  364.             p[j]=*++g;
  365.         }
  366.         g++;
  367.         *stp=TY_ADDR;
  368.     }else{
  369.         x=i;
  370.     }
  371.     sp->p = p;
  372.     sp->c = i;
  373.     sp->x = x;
  374.     *gp = g;
  375. }
  376.  
  377. void scrip7(char *code,void *data){
  378.     char **v=globa7.v;
  379.     int i;
  380.     if(data){
  381.         for(i=0;i<6;i++)v[i]=data;
  382.         globa7.data=data;
  383.     }
  384.     char *g=code,*h=code;
  385.     int op,d,dt,dx,s,st,sx;
  386.     struct va7 dv,sv;
  387.     wh(*g){
  388.         char*j=skipp(g);
  389.         if(j!=g)Log("skipped parens");
  390.         g=j;
  391.         if(*g=='$'){
  392.             wh(*g&&*g!='#')g++;
  393.             if(*g)g++;
  394.             Log("dollar skips to hash");
  395.             continue;
  396.         }
  397.         if(*g=='`'){Log("backtick is early exit");goto hell;}
  398.         if((*g>0&&*g<=' ')||*g=='#'){g++;continue;}
  399.         un((*g<='Z'&&*g>='A')||(*g<='z'&&*g>='a')||*g=='_')
  400.             Die("bad dest name");
  401.         gettype(g,&d,&dt);
  402.         dx=0;
  403.         sx=0;
  404.         g++;
  405.         wh(*g>0&&*g<=' ')g++;
  406.         if(*g==0)Die("unexpected zero");
  407.         if(*g=='('){
  408.             g++;
  409.             dx=parsedec(&g);
  410.         }ei(*g==')'){
  411.             g++;
  412.             dx=parsedec(&g)*tpsz[dt];
  413.         }
  414.         if(*g==0)Die("unexpected zero");
  415.         op=*g;
  416.         g++;
  417.         if(*g==0)Die("unexpected zero");
  418.         if((*g<='z'&&*g>='a')||(*g<='Z'&&*g>='A')){
  419.             gettype(g,&s,&st);
  420.             g++;
  421.             if(*g=='('){
  422.                 g++;
  423.                 sx=parsedec(&g);
  424.             }ei(*g==')'){
  425.                 g++;
  426.                 sx=parsedec(&g)*tpsz[st];
  427.             }
  428.         }ei((*g<='9'&&*g>='0')||*g=='.'||*g=='-'||*g=='%'){
  429.             s=8;
  430.             parsenum(&g,&st,&sv);
  431.         }ei(*g=='\''){
  432.             s=8;
  433.             st=TY_INT8;
  434.             g++;
  435.             sv.x=sv.c=*g;
  436.             g++;
  437.         }ei(*g=='{'){
  438.             s=8;
  439.             st=TY_ADDR;
  440.             sv.p=g+1;
  441.             sv.x=sv.c=0;
  442.             g=skipp(g)+1;
  443.         }else Die("bad arg");
  444.         if(dt==-1)dt=st;
  445.         Log("%s %d %s %c %s %d %s",vrnm[d],dx,tpnm[dt],op,vrnm[s],sx,tpnm[st]);
  446.         char **sp=0;
  447.         char *spp;
  448.         if(s<8){
  449.             sp=(s<6)?&(v[s]):(s==6)?&g:&h;
  450.             getval(st,sp,sx,&sv);
  451.         }else{
  452.             spp=(st==TY_ADDR?sv.p:st<4?(char*)&(sv.c):(char*)&(sv.x));
  453.             sp=&spp;
  454.         }
  455.         char **dp=(d<6)?&(v[d]):(d==9)?0:(d==6)?&g:&h;
  456.         getval(dt,dp,dx,&dv);
  457.         int skip=0;
  458.         if(op=='='){
  459.             setval(dt,dp,dx,&sv);
  460.         }ei(op=='z'){
  461.             setval(st,sp,sx,&dv);
  462.             setval(dt,dp,dx,&sv);
  463.         }ei(s7ioflag&&op=='p'){
  464.             if(dt<=TY_INT64)printf("%"PRId64"\r\n",(sv.c));
  465.             ei(dt<=TY_PTR)printf("%p\r\n",(sv.p));
  466.             else printf("%f\r\n",(sv.x));
  467.             setval(dt,dp,dx,&sv);
  468.         }ei(s7ioflag&&op=='x'){
  469.             if(dt==TY_INT8)printf("%02"PRIx8"\r\n",(uint8_t)(sv.c));
  470.             ei(dt==TY_INT16)printf("%04"PRIx16"\r\n",(uint16_t)(sv.c));
  471.             ei(dt==TY_INT32)printf("%08"PRIx32"\r\n",(uint32_t)(sv.c));
  472.             ei(dt==TY_INT64)printf("%016"PRIx64"\r\n",(sv.c));
  473.             ei(dt<=TY_PTR)printf("%p\r\n",(sv.p));
  474.             else{
  475.                 int64_t n,d;
  476.                 undiv(sv.x,&n,&d);
  477.                 printf("%"PRId64"/%"PRId64"\r\n",n,d);
  478.             }
  479.             setval(dt,dp,dx,&sv);
  480.         }ei(s7ioflag&&op=='r'){
  481.             char *r=s7getinput(stdin,'\n');
  482.             if(dt<=TY_INT64)dv.c=strtol(r,0,0);
  483.             ei(dt==TY_FLOAT||dt==TY_DOUBLE)dv.x=strtod(r,0);
  484.             free(r);
  485.             setval(dt,dp,dx,&dv);
  486.         }ei(s7ioflag&&op=='G'){
  487.             dv.p=s7getinput(stdin,sv.c);
  488.             setval(TY_ADDR,dp,dx,&dv);
  489.         }ei(op=='S'){
  490.             char *r=*dp;
  491.             struct va7 nv;
  492.             getval(TY_INT64,&v[5],0,&nv);
  493.             if(st==TY_PTR||st==TY_ADDR){
  494.                 memmove(r,*sp,nv.c*tpsz[dt]);
  495.             }else{
  496.                 memsetl(r,*sp,tpsz[st],nv.c);
  497.             }
  498.         }ei(op=='L'){
  499.             struct va7 nv;
  500.             nv.c = memlen(*dp,&sv,dt);
  501.             setval(TY_INT64,v+5,0,&nv);
  502.         }ei(op=='\\'){
  503.             int64_t n,d;
  504.             undiv(sv.x,&n,&d);
  505.             dv.x=dv.c = n;
  506.             setval(dt,dp,dx,&dv);
  507.             dv.x=dv.c = d;
  508.             *dp = *dp + tpsz[dt];
  509.             setval(dt,dp,dx,&dv);
  510.             *dp = *dp - tpsz[dt];
  511.         }ei(s7ioflag&&op=='R'){
  512.             if(0>=fread(*dp,tpsz[dt],sv.c,stdin))
  513.                 Log("Read Failed. Ignoring.\n");
  514.         }ei(s7ioflag&&op=='W'){
  515.             fwrite(*dp,tpsz[dt],sv.c,stdout);
  516.         }ei(s7ioflag&&op=='.'){
  517.             putchar(sv.c);
  518.             setval(dt,dp,dx,&sv);
  519.         }ei(s7ioflag&&op==','){
  520.             dv.x=dv.c=getchar();
  521.             setval(dt,dp,dx,&dv);
  522.         }ei(op=='+'){
  523.             dv.c+=sv.c;
  524.             dv.x+=sv.x;
  525.             dv.p+=sv.c;
  526.             setval(dt,dp,dx,&dv);
  527.         }ei(op=='-'){
  528.             dv.c-=sv.c;
  529.             dv.x-=sv.x;
  530.             dv.p-=sv.c;
  531.             setval(dt,dp,dx,&dv);
  532.         }ei(op=='/'){
  533.             dv.c/=sv.c;
  534.             dv.x/=sv.x;
  535.             setval(dt,dp,dx,&dv);
  536.         }ei(op=='%'){
  537.             dv.c%=sv.c;
  538.             dv.x=fmod(dv.x,sv.x);
  539.             setval(dt,dp,dx,&dv);
  540.         }ei(op=='*'){
  541.             dv.c*=sv.c;
  542.             dv.x*=dv.x;
  543.             setval(dt,dp,dx,&dv);
  544.         }ei(op=='|'){
  545.             dv.c|=sv.c;
  546.             setval(dt,dp,dx,&dv);
  547.         }ei(op=='&'){
  548.             dv.c&=sv.c;
  549.             setval(dt,dp,dx,&dv);
  550.         }ei(op=='^'){
  551.             dv.c=pow(dv.c,sv.x);
  552.             dv.x=pow(dv.x,sv.x);
  553.             setval(dt,dp,dx,&dv);
  554.         }ei(op=='c'){
  555.             dv.c=dv.x=dv.x*cos(sv.x);
  556.             setval(dt,dp,dx,&dv);
  557.         }ei(op=='s'){
  558.             dv.c=dv.x=dv.x*tan(sv.x);
  559.             setval(dt,dp,dx,&dv);
  560.         }ei(op=='_'){
  561.             dv.c=dv.x=dv.x*log(sv.x);
  562.             setval(dt,dp,dx,&dv);
  563.         }ei(op=='t'){
  564.             dv.c=dv.x=dv.x*tan(sv.x);
  565.             setval(dt,dp,dx,&dv);
  566.         }ei(op=='a'){
  567.             dv.c=dv.x=atan2(dv.x,sv.x);
  568.             setval(dt,dp,dx,&dv);
  569.         }ei(op=='e'){
  570.             dv.c=dv.x=dv.x*exp(sv.x);
  571.             setval(dt,dp,dx,&dv);
  572.         }ei(op=='X'){
  573.             dv.c^=sv.c;
  574.             setval(dt,dp,dx,&dv);
  575.         }ei(op=='M'){
  576.             *dp=malloc(sv.c*tpsz[dt]);
  577.         }ei(op=='N'){
  578.             *dp=realloc(*dp,sv.c*tpsz[dt]);
  579.         }ei(op=='>'){
  580.             *dp=*dp+(sv.c*tpsz[dt]);
  581.         }ei(op==':'){
  582.             setval(dt,dp,dx,&sv);
  583.             *dp=*dp+tpsz[dt];
  584.         }ei(op==';'){
  585.             *dp=*dp-tpsz[dt];
  586.             setval(dt,dp,dx,&sv);
  587.         }ei(op=='<'){
  588.             *dp=*dp-(sv.c*tpsz[dt]);
  589.         }ei(op=='F'){
  590.             free(*dp);
  591.             *dp=globa7.data;
  592.         }ei(op=='~'){
  593.             if(dt<=TY_INT64)skip=(dv.c!=sv.c);
  594.             ei(dt<=TY_PTR)skip=(dv.p!=sv.p);
  595.             else skip=(dv.x!=sv.x);
  596.         }ei(op=='g'){
  597.             if(dt<=TY_INT64)skip=(dv.c<=sv.c);
  598.             ei(dt<=TY_PTR)skip=(dv.p<=sv.p);
  599.             else skip=(dv.x<=sv.x);
  600.         }ei(op=='l'){
  601.             if(dt<=TY_INT64)skip=(dv.c>=sv.c);
  602.             ei(dt<=TY_PTR)skip=(dv.p>=sv.p);
  603.             else skip=(dv.x>=sv.x);
  604.         }ei(op=='!'){
  605.             if(dt<=TY_INT64)skip=(dv.c==sv.c);
  606.             ei(dt<=TY_PTR)skip=(dv.p==sv.p);
  607.             else skip=(dv.x==sv.x);
  608.         }else Die("Bad Operator");
  609.         if(skip){
  610.             Log("condition false, skipping");
  611.             wh(*g&&*g!='#')g++;
  612.             if(*g)g++;
  613.         }
  614.     }
  615.     hell:
  616.     Log("end");
  617. }
  618.  
  619. int scrip7rc(FILE *in,void*data){
  620.     char *cmd=s7getcmd(in);
  621.     if(*cmd==0){free(cmd);return 0;}
  622.     scrip7(cmd,data);
  623.     if(s7freeflag)free(cmd);
  624.     return 1;
  625. }
  626.  
  627. void scrip7f(FILE *f,void*data){
  628.     wh(!feof(f))scrip7rc(f,data);
  629. }
  630.  
  631. void scrip7cli(FILE *in,void*data){
  632.     scrip7("",data);
  633.     wh(!feof(in)&&scrip7rc(in,0));
  634. }
  635.  
  636. #if !defined(NOS7MAIN)&&!defined(S7IDE)
  637. __attribute__((weak)) int main(int argc,char **argv){
  638.     char *data=malloc(1000);
  639.     int i=argc,cli=(i==1);
  640.     wh(i>1){
  641.         i--;
  642.         FILE *f=fopen(argv[i],"r");
  643.         if(!f){
  644.             if(strchr(argv[i],'d'))s7logflag=1;
  645.             if(strchr(argv[i],'f'))s7freeflag=1;
  646.             if(strchr(argv[i],'c'))cli=1;
  647.             continue;
  648.         }
  649.         scrip7f(f,data);
  650.         fclose(f);
  651.     }
  652.     if(cli)scrip7cli(stdin,data);
  653.     return 0;
  654. }
  655. #endif
  656.  
  657. #ifdef S7IDE
  658. #include <ncurses.h>
  659. #define ALT 0x800
  660. #define BRIGHTCYAN (COLOR_PAIR(2)|A_BOLD)
  661. #define BRIGHTRED (COLOR_PAIR(1)|A_BOLD)
  662. #define BRIGHTGOLD (COLOR_PAIR(3)|A_BOLD)
  663.  
  664. int arrayview=0;/*0=chars 1=hex*/
  665. #define MAXARRVIEW 8
  666.  
  667. void drawvars(){
  668.     int i,j;
  669.     for(i=0;i<6;i++){
  670.         if(arrayview==0){for(j=0;j<COLS;j++){
  671.             uint8_t k = globa7.v[i][j];
  672.             uint8_t kk= k&0x7f;
  673.             if(kk<32)kk=kk+'@';
  674.             mvaddch(i+1,j,((k&0x7f)<' '?A_REVERSE:0)
  675.                 |(k&0x80?BRIGHTRED:0)|kk);
  676.         }}ei(arrayview==1){for(j=0;j<COLS/2;j++){
  677.             uint8_t k = globa7.v[i][j];
  678.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  679.             mvprintw(i+1,j*2,"%02x",k);
  680.             attrset(COLOR_PAIR(0));
  681.         }}ei(arrayview==2){for(j=0;j<COLS/4;j++){
  682.             int8_t k = ((int8_t*)globa7.v[i])[j];
  683.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  684.             mvprintw(i+1,j*4,"%+4"PRId8,k);
  685.             attrset(COLOR_PAIR(0));
  686.         }}ei(arrayview==3){for(j=0;j<COLS/6;j++){
  687.             int16_t k = ((int16_t*)globa7.v[i])[j];
  688.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  689.             mvprintw(i+1,j*6,"%+6"PRId16,k);
  690.             attrset(COLOR_PAIR(0));
  691.         }}ei(arrayview==4){for(j=0;j<COLS/11;j++){
  692.             int32_t k = ((int32_t*)globa7.v[i])[j];
  693.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  694.             mvprintw(i+1,j*11,"%+11"PRId32,k);
  695.             attrset(COLOR_PAIR(0));
  696.         }}ei(arrayview==5){for(j=0;j<COLS/20;j++){
  697.             int64_t k = ((int64_t*)globa7.v[i])[j];
  698.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  699.             mvprintw(i+1,j*20,"%+20"PRId64,k);
  700.             attrset(COLOR_PAIR(0));
  701.         }}ei(arrayview==6){for(j=0;j<COLS/15;j++){
  702.             float k = ((float*)globa7.v[i])[j];
  703.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  704.             mvprintw(i+1,j*15,"%.6g",k);
  705.             attrset(COLOR_PAIR(0));
  706.         }}ei(arrayview==7){for(j=0;j<COLS/25;j++){
  707.             double k = ((double*)globa7.v[i])[j];
  708.             attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
  709.             mvprintw(i+1,j*25,"%.15g",k);
  710.             attrset(COLOR_PAIR(0));
  711.         }}
  712.     }
  713. }
  714.  
  715.  
  716. int main(){
  717.     initscr();
  718.     cbreak();
  719.     noecho();
  720.     keypad(stdscr,TRUE);
  721.     meta(stdscr,TRUE);
  722.     start_color();
  723.     use_default_colors();
  724.     init_pair(1,COLOR_RED,-1);
  725.     init_pair(2,COLOR_CYAN,-1);
  726.     init_pair(3,COLOR_YELLOW,-1);
  727.     int y=0,x=0;//cursor position
  728.     char interactive[1000]="";
  729.     char data[1000];
  730.     scrip7("",data);
  731.     loop{
  732.         erase();
  733.         int xp = x>COLS/2?x-COLS/2:0;
  734.         int len = strlen(interactive);
  735.         mvprintw(0,0,"%*s",(len-xp>COLS)?COLS:len-xp,interactive+xp);
  736.         drawvars();
  737.         int c=mvgetch(0,x>COLS/2?COLS/2:x);
  738.         if(c==EOF||c==ERR)break;
  739.         if(c==27){
  740.             c=ALT|getch();
  741.         }ei(c==(KEY_RIGHT)){
  742.             if(x<(int)strlen(interactive))x++;
  743.         }ei(c==KEY_LEFT){
  744.             if(x>0)x--;
  745.         }ei(c==KEY_BACKSPACE){if(x>0){
  746.             memmove(interactive+x-1,interactive+x,len-x+1);
  747.             x--;
  748.         }}ei(c=='A'-'@'){
  749.             arrayview++;
  750.             arrayview%=MAXARRVIEW;
  751.         }ei(c=='\n'){
  752.             clear();
  753.             move(7,0);
  754.             refresh();
  755.             scrip7(interactive,0);
  756.             interactive[0]=0;x=0;
  757.         }ei(c>=' '&&c<='~'){
  758.             memmove(interactive+x+1,interactive+x,len-x+1);
  759.             interactive[x]=c;
  760.             x++;
  761.         }
  762.     }
  763.     endwin();
  764.     return 0;
  765. }
  766.  
  767. #endif
  768. #endif
  769. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement