Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if 0
- echo "Compiling binaries and extracting doc and test..."
- cc $0 -lm -o scrip7
- cc -DNOS7MAIN $0 -c -lm -o scrip7.o
- cpp $0 -DDOCS -P >docs.txt
- cpp $0 -DTEST -P >test.sh
- cc -DS7IDE $0 -lm -lncurses -o s7ide
- bash test.sh
- exit 0
- #endif
- #ifdef DOCS
- Scrip7 hopefully getting stabler release 2014-12-17 06:30
- You can extract and compile the full distribution simply by running this
- file as a shell script: sh scrip7.c
- To compile the simple interpreter, run a command like this:
- cc scrip7.c -lm -o scrip7
- To include, define INTERFACE and then include this file. If your platform
- does not support weak symbols, you will also need to define NOS7MAIN when
- compiling the library.
- To get this documentation alone, run the following command:
- cpp scrip7.c -DDOCS -P >docs.txt
- This release includes a rough prototype of the Scrip7 advanced IDE/REPL. To
- compile it, run a command similar to this:
- cc -DS7IDE scrip7.c -lm -lncurses -o s7ide
- Changes to the language in this new version:
- none
- Changes to the IDE in this new version:
- Made this file self-compiling.
- #elif defined(TEST)
- echo "Running test:"
- ./scrip7 >output <<END
- I=260I%170I+8I*9I/2I-5_pI {checks arithmetic}
- I=7%7f I&6%e0 I|3%01 IX7%0f _xI {checks bit operations}
- I=5I^5_pII=3I^4_pI {checks exponentiation}
- u=43/8_xi {basic check for ieee float}
- U=35478/256_xI {basic check for ieee double}
- U=355/113_pU {check real number output}
- I=1J>1[J+II+JIl1000}#_pI {check basic looping}
- I=%0a53545556575859 [_.aa>1O!P}# {check character output and byte order}
- X=4.5325_pX_xXJ\X_pJJ>1_pJ {check float literals and output some more,and undivide}
- I=-99_pI {check negative integer literals}
- J<2J:23J:17J:27J:67J:44
- {Now a test of insertion sort}
- [O=RQ=R[IlKQ=O#I>1O!P}#KzLL>1R!P}#
- O=SP=SQ=SR=S
- _pII>1_pII>1_pII>1_pII>1_pI
- END
- tr -d '\015' <output >out
- if diff out - <<END
- 436
- 0f6f6f6f6e6e6e6e
- 3125
- 81
- 40ac0000
- 406152c000000000
- 3.141593
- 1597
- YXWVUTS
- 4.532500
- 1813/400
- 1813
- 400
- -99
- 17
- 23
- 27
- 44
- 67
- END
- then
- echo "Success"
- else
- echo "Failure"
- fi
- #else
- #include "stdio.h"
- //FILE *s7in;
- //FILE *s7out;
- extern int s7logflag,s7freeflag,s7ioflag,s7errflag;
- /*Declarations for non-static*/
- void scrip7(char *code,void *data);
- /*execute string*/
- void scrip7f(FILE *code,void *data);
- /*execute whole file as a series of programs.*/
- int scrip7rc(FILE *code,void *data);
- /*execute a program, ending with .\n, returns 0 if the program was empty.*/
- void scrip7cli(FILE *code,void *data);
- /*execute a set of programs, ending with an empty program.*/
- struct scrip7state{
- char *v[6];
- char *data;
- }globa7;
- #ifndef INTERFACE
- int s7logflag=0;
- int s7freeflag=0;
- int s7ioflag=1;
- int s7errflag=1;
- #include "stdlib.h"
- #include "string.h"
- #include "stdint.h"
- #include "math.h"
- #include "inttypes.h"
- #include "stddef.h"
- #define ei else if
- #define un(x) if(!(x))
- #define wh while
- #define loop for(;;)
- #define let(x,y) typeof(y)x=y
- struct va7 {int64_t c;double x;char *p;};
- static char *s7getcmd(FILE *f){
- int n=80,l=0;
- char *s=NULL,*q;
- loop{
- s=realloc(s,n);
- q=fgets(s+l,n-l,f);
- if(!q)return s;
- l+=strlen(s+l);
- if(s[l-1]=='\n')
- if(s[l-2]=='.'){
- s[l-2]=0;
- return s;
- }
- if(l==n-1)n*=2;
- }
- }
- int undiv(double x,int64_t*np,int64_t*dp){
- double y;int i=0;
- int64_t p=0,q=1,r=1,s=0,n;
- do{i++;if(i>10)break;
- n = (int64_t)((p-x*q)/(x*s-r));
- p += n*r;q += n*s;y = (double)p/q;
- if(y==x){*np=p;*dp=q;return i;}
- n = (int64_t)((r-x*s)/(x*q-p));
- r += n*p;s += n*q;y = (double)r/s;
- }while(y!=x);
- *np=r;*dp=s;return i;
- }
- static void memsetl(char *r,char *s,int len,int num){
- memmove(r,s,len);
- int k=1;
- wh(k<num){
- memcpy(r+k*len,r,len*(k*2>num?num-k:k));
- k*=2;
- }
- }
- static char *s7getinput(FILE *f,char b){
- int n=80,l=0;
- char *s=NULL,*q;
- wh(1){
- s=realloc(s,n);
- q=fgets(s+l,n-l,f);
- if(!q)return s;
- l+=strlen(s+l);
- if(s[l-1]==b)return s;
- if(l==n-1)n*=2;
- }
- }
- #define TY_INT8 0
- #define TY_INT16 1
- #define TY_INT32 2
- #define TY_INT64 3
- #define TY_ADDR 4
- #define TY_PTR 5
- #define TY_FLOAT 6
- #define TY_DOUBLE 7
- static char *tpnm[]={"int8","int16","int32","int64","addr","void*","float","double"};
- #define VR_AIOU 0
- #define VR_BJPV 1
- #define VR_CKQW 2
- #define VR_DLRX 3
- #define VR_EMSY 4
- #define VR_FNTZ 5
- #define VR_G 6
- #define VR_H 7
- #define VR_LIT 8
- #define VR_VOID 9
- static char *vrnm[]={"aiou","bjpv","ckqw","dlrx","emsy","fntz","g","h","constant","voidvar"};
- static int tpsz[]={1,2,4,8,1,sizeof(void*),sizeof(float),sizeof(double)};
- #define Log(mesg,args...) {if(s7logflag)fprintf(stderr,"%ld:"mesg"\r\n",g-code,##args);}wh(0)
- #define Die(mesg,args...) {if(s7errflag)fprintf(stderr,"%ld:"mesg"\r\n",g-code,##args);goto hell;}wh(0)
- static void gettype(char*g,int*d,int *dt){
- if(*g>='a'&&*g<='f')*d=*g-'a',*dt=TY_INT8;
- ei(*g>='A'&&*g<='F')*d=*g-'A',*dt=TY_INT16;
- ei(*g>='i'&&*g<='n')*d=*g-'i',*dt=TY_INT32;
- ei(*g>='I'&&*g<='N')*d=*g-'I',*dt=TY_INT64;
- ei(*g>='o'&&*g<='t')*d=*g-'o',*dt=TY_PTR;
- ei(*g>='O'&&*g<='T')*d=*g-'O',*dt=TY_ADDR;
- ei(*g>='u'&&*g<='z')*d=*g-'u',*dt=TY_FLOAT;
- ei(*g>='U'&&*g<='Z')*d=*g-'U',*dt=TY_DOUBLE;
- ei(*g=='G')*d=VR_G,*dt=TY_ADDR;
- ei(*g=='H')*d=VR_H,*dt=TY_ADDR;
- ei(*g=='g')*d=VR_G,*dt=TY_INT8;
- ei(*g=='h')*d=VR_H,*dt=TY_INT8;
- ei(*g=='_')*d=VR_VOID,*dt=-1;
- }
- static void setval(int dt,char **dp, ptrdiff_t dx, struct va7*v){
- if(dp==0)return;
- if(dt==TY_INT8)(*(int8_t*)(*dp+dx)) = v->c;
- ei(dt==TY_INT16)(*(int16_t*)(*dp+dx)) = v->c;
- ei(dt==TY_INT32)(*(int32_t*)(*dp+dx)) = v->c;
- ei(dt==TY_INT64)(*(int64_t*)(*dp+dx)) = v->c;
- ei(dt==TY_ADDR)(*dp) = v->p-dx;
- ei(dt==TY_PTR)(*(void**)(*dp+dx)) = v->p;
- ei(dt==TY_FLOAT)(*(float*)(*dp+dx)) = v->x;
- ei(dt==TY_DOUBLE)*(double*)(*dp+dx) = v->x;
- }
- static void getval(int st,char **sp, ptrdiff_t sx, struct va7 *v){
- if(!sp)return;
- if(st==TY_INT8)v->c=*(int8_t*)(*sp+sx);
- ei(st==TY_INT16)v->c=*(int16_t*)(*sp+sx);
- ei(st==TY_INT32)v->c=*(int32_t*)(*sp+sx);
- ei(st==TY_INT64)v->c=*(int64_t*)(*sp+sx);
- ei(st==TY_ADDR)v->p=(*sp+sx);
- ei(st==TY_PTR)v->p=*(void**)(*sp+sx);
- ei(st==TY_FLOAT)v->x=*(float*)(*sp+sx);
- ei(st==TY_DOUBLE)v->x=*(double*)(*sp+sx);
- if(st<=TY_INT64){v->p=(*sp+sx);v->x=v->c;}
- ei(st<=TY_PTR){v->c=(int64_t)v->p;v->x=v->c;}
- ei(st<=TY_DOUBLE){v->c=v->x;v->p=(*sp+sx);}
- }
- static int64_t memlen(char *d,struct va7 *s,int t){
- int64_t n=0;
- struct va7 v;
- loop{
- char *q=d+tpsz[t]*n;
- getval(t,&q,0,&v);
- if(t<TY_ADDR&&v.c==s->c)break;
- ei(t<TY_FLOAT&&t>=TY_ADDR&&v.p==s->p)break;
- ei(t<8&&t>=TY_FLOAT&&v.x==s->x)break;
- n++;
- }
- return n;
- }
- #define usg uintptr_t
- static char *fwdjmptbl[256][2];
- static uint8_t bakjmptbl[256];
- static int pcache(char **s){
- if(**s=='{'){
- uint8_t k = ((usg)*s)%256;
- if(fwdjmptbl[k][0]==*s){
- *s = fwdjmptbl[k][1]+1;
- return 1;
- }else return 0;
- }
- if(**s=='}'){
- uint8_t k = bakjmptbl[((usg)*s)%256];
- if(fwdjmptbl[k][1]==*s){
- *s = fwdjmptbl[k][0]+1;
- return 1;
- }else return 0;
- }
- return 0;
- }
- static char *skipp(char *s){
- int l=0,nl=0;
- char *ss=s;
- if(*s=='['||*s==']')return s+1;
- un(*s=='{'||*s=='}')return s;
- if(pcache(&s))return s;
- do{
- if(*s=='['||*s=='{')nl=l+1;
- if(*s==']'||*s=='}')nl=l-1;
- if(nl==0){
- if(l>0){
- fwdjmptbl[((usg)ss)%256][0]=ss;
- fwdjmptbl[((usg)ss)%256][1]=s;
- bakjmptbl[((usg)s)%256]=((usg)ss)%256;
- s++;
- }ei(l<0){
- fwdjmptbl[((usg)s)%256][0]=s;
- fwdjmptbl[((usg)s)%256][1]=ss;
- bakjmptbl[((usg)ss)%256]=((usg)s)%256;
- s++;
- }
- return s;
- }
- l=nl;
- if(l<0)s--;
- if(l>0)s++;
- }wh(1);
- }
- static int64_t parsedec(char **gp){
- int64_t i=0;
- wh(**gp>='0'&&**gp<='9'){
- i=i*10+*(*gp)++-'0';
- }
- return i;
- }
- static void parsenum(char **gp,int *stp,struct va7 *sp){
- int64_t i=0,j;
- double x;
- char *p=0;
- int sgn=1;
- char *g=*gp;
- if(*g>='0'&&*g<='9'){
- i=parsedec(&g);
- }else if(*g=='-'){
- sgn = -1;
- g++;
- i=-parsedec(&g);
- }
- x = i;
- *stp = TY_INT64;
- if(*g=='.'){
- *stp = TY_DOUBLE;
- g++;
- j=0;
- while(*g>='0'&&*g<='9'){
- i=i*10+(*g++-'0')*sgn;
- j++;
- }
- i=x=(double)i/pow(10,j);
- if(*g=='^'){
- g++;
- j=parsedec(&g);
- x*=pow(10,j);
- }
- }ei(*g=='/'){
- *stp = TY_DOUBLE;
- g++;
- j=parsedec(&g);
- i=x=(double)i/j;
- }ei(*g=='%'){
- g++;
- j=0;
- int l=0;
- loop{
- int k=(*g+30)%39;//hex conv hak
- if(k>=16)break;
- j=j*16+k;
- g++;l++;
- }
- int64_t t=j;
- wh(i>0){
- j=(j<<(l*4))+t;
- i--;
- }
- i=j;
- x=i;
- }ei(*g=='"'){
- p=(char*)malloc(i+1);
- p[i]=0;
- for(j=0;j<i;j++){
- p[j]=*++g;
- }
- g++;
- *stp=TY_ADDR;
- }else{
- x=i;
- }
- sp->p = p;
- sp->c = i;
- sp->x = x;
- *gp = g;
- }
- void scrip7(char *code,void *data){
- char **v=globa7.v;
- int i;
- if(data){
- for(i=0;i<6;i++)v[i]=data;
- globa7.data=data;
- }
- char *g=code,*h=code;
- int op,d,dt,dx,s,st,sx;
- struct va7 dv,sv;
- wh(*g){
- char*j=skipp(g);
- if(j!=g)Log("skipped parens");
- g=j;
- if(*g=='$'){
- wh(*g&&*g!='#')g++;
- if(*g)g++;
- Log("dollar skips to hash");
- continue;
- }
- if(*g=='`'){Log("backtick is early exit");goto hell;}
- if((*g>0&&*g<=' ')||*g=='#'){g++;continue;}
- un((*g<='Z'&&*g>='A')||(*g<='z'&&*g>='a')||*g=='_')
- Die("bad dest name");
- gettype(g,&d,&dt);
- dx=0;
- sx=0;
- g++;
- wh(*g>0&&*g<=' ')g++;
- if(*g==0)Die("unexpected zero");
- if(*g=='('){
- g++;
- dx=parsedec(&g);
- }ei(*g==')'){
- g++;
- dx=parsedec(&g)*tpsz[dt];
- }
- if(*g==0)Die("unexpected zero");
- op=*g;
- g++;
- if(*g==0)Die("unexpected zero");
- if((*g<='z'&&*g>='a')||(*g<='Z'&&*g>='A')){
- gettype(g,&s,&st);
- g++;
- if(*g=='('){
- g++;
- sx=parsedec(&g);
- }ei(*g==')'){
- g++;
- sx=parsedec(&g)*tpsz[st];
- }
- }ei((*g<='9'&&*g>='0')||*g=='.'||*g=='-'||*g=='%'){
- s=8;
- parsenum(&g,&st,&sv);
- }ei(*g=='\''){
- s=8;
- st=TY_INT8;
- g++;
- sv.x=sv.c=*g;
- g++;
- }ei(*g=='{'){
- s=8;
- st=TY_ADDR;
- sv.p=g+1;
- sv.x=sv.c=0;
- g=skipp(g)+1;
- }else Die("bad arg");
- if(dt==-1)dt=st;
- Log("%s %d %s %c %s %d %s",vrnm[d],dx,tpnm[dt],op,vrnm[s],sx,tpnm[st]);
- char **sp=0;
- char *spp;
- if(s<8){
- sp=(s<6)?&(v[s]):(s==6)?&g:&h;
- getval(st,sp,sx,&sv);
- }else{
- spp=(st==TY_ADDR?sv.p:st<4?(char*)&(sv.c):(char*)&(sv.x));
- sp=&spp;
- }
- char **dp=(d<6)?&(v[d]):(d==9)?0:(d==6)?&g:&h;
- getval(dt,dp,dx,&dv);
- int skip=0;
- if(op=='='){
- setval(dt,dp,dx,&sv);
- }ei(op=='z'){
- setval(st,sp,sx,&dv);
- setval(dt,dp,dx,&sv);
- }ei(s7ioflag&&op=='p'){
- if(dt<=TY_INT64)printf("%"PRId64"\r\n",(sv.c));
- ei(dt<=TY_PTR)printf("%p\r\n",(sv.p));
- else printf("%f\r\n",(sv.x));
- setval(dt,dp,dx,&sv);
- }ei(s7ioflag&&op=='x'){
- if(dt==TY_INT8)printf("%02"PRIx8"\r\n",(uint8_t)(sv.c));
- ei(dt==TY_INT16)printf("%04"PRIx16"\r\n",(uint16_t)(sv.c));
- ei(dt==TY_INT32)printf("%08"PRIx32"\r\n",(uint32_t)(sv.c));
- ei(dt==TY_INT64)printf("%016"PRIx64"\r\n",(sv.c));
- ei(dt<=TY_PTR)printf("%p\r\n",(sv.p));
- else{
- int64_t n,d;
- undiv(sv.x,&n,&d);
- printf("%"PRId64"/%"PRId64"\r\n",n,d);
- }
- setval(dt,dp,dx,&sv);
- }ei(s7ioflag&&op=='r'){
- char *r=s7getinput(stdin,'\n');
- if(dt<=TY_INT64)dv.c=strtol(r,0,0);
- ei(dt==TY_FLOAT||dt==TY_DOUBLE)dv.x=strtod(r,0);
- free(r);
- setval(dt,dp,dx,&dv);
- }ei(s7ioflag&&op=='G'){
- dv.p=s7getinput(stdin,sv.c);
- setval(TY_ADDR,dp,dx,&dv);
- }ei(op=='S'){
- char *r=*dp;
- struct va7 nv;
- getval(TY_INT64,&v[5],0,&nv);
- if(st==TY_PTR||st==TY_ADDR){
- memmove(r,*sp,nv.c*tpsz[dt]);
- }else{
- memsetl(r,*sp,tpsz[st],nv.c);
- }
- }ei(op=='L'){
- struct va7 nv;
- nv.c = memlen(*dp,&sv,dt);
- setval(TY_INT64,v+5,0,&nv);
- }ei(op=='\\'){
- int64_t n,d;
- undiv(sv.x,&n,&d);
- dv.x=dv.c = n;
- setval(dt,dp,dx,&dv);
- dv.x=dv.c = d;
- *dp = *dp + tpsz[dt];
- setval(dt,dp,dx,&dv);
- *dp = *dp - tpsz[dt];
- }ei(s7ioflag&&op=='R'){
- if(0>=fread(*dp,tpsz[dt],sv.c,stdin))
- Log("Read Failed. Ignoring.\n");
- }ei(s7ioflag&&op=='W'){
- fwrite(*dp,tpsz[dt],sv.c,stdout);
- }ei(s7ioflag&&op=='.'){
- putchar(sv.c);
- setval(dt,dp,dx,&sv);
- }ei(s7ioflag&&op==','){
- dv.x=dv.c=getchar();
- setval(dt,dp,dx,&dv);
- }ei(op=='+'){
- dv.c+=sv.c;
- dv.x+=sv.x;
- dv.p+=sv.c;
- setval(dt,dp,dx,&dv);
- }ei(op=='-'){
- dv.c-=sv.c;
- dv.x-=sv.x;
- dv.p-=sv.c;
- setval(dt,dp,dx,&dv);
- }ei(op=='/'){
- dv.c/=sv.c;
- dv.x/=sv.x;
- setval(dt,dp,dx,&dv);
- }ei(op=='%'){
- dv.c%=sv.c;
- dv.x=fmod(dv.x,sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='*'){
- dv.c*=sv.c;
- dv.x*=dv.x;
- setval(dt,dp,dx,&dv);
- }ei(op=='|'){
- dv.c|=sv.c;
- setval(dt,dp,dx,&dv);
- }ei(op=='&'){
- dv.c&=sv.c;
- setval(dt,dp,dx,&dv);
- }ei(op=='^'){
- dv.c=pow(dv.c,sv.x);
- dv.x=pow(dv.x,sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='c'){
- dv.c=dv.x=dv.x*cos(sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='s'){
- dv.c=dv.x=dv.x*tan(sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='_'){
- dv.c=dv.x=dv.x*log(sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='t'){
- dv.c=dv.x=dv.x*tan(sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='a'){
- dv.c=dv.x=atan2(dv.x,sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='e'){
- dv.c=dv.x=dv.x*exp(sv.x);
- setval(dt,dp,dx,&dv);
- }ei(op=='X'){
- dv.c^=sv.c;
- setval(dt,dp,dx,&dv);
- }ei(op=='M'){
- *dp=malloc(sv.c*tpsz[dt]);
- }ei(op=='N'){
- *dp=realloc(*dp,sv.c*tpsz[dt]);
- }ei(op=='>'){
- *dp=*dp+(sv.c*tpsz[dt]);
- }ei(op==':'){
- setval(dt,dp,dx,&sv);
- *dp=*dp+tpsz[dt];
- }ei(op==';'){
- *dp=*dp-tpsz[dt];
- setval(dt,dp,dx,&sv);
- }ei(op=='<'){
- *dp=*dp-(sv.c*tpsz[dt]);
- }ei(op=='F'){
- free(*dp);
- *dp=globa7.data;
- }ei(op=='~'){
- if(dt<=TY_INT64)skip=(dv.c!=sv.c);
- ei(dt<=TY_PTR)skip=(dv.p!=sv.p);
- else skip=(dv.x!=sv.x);
- }ei(op=='g'){
- if(dt<=TY_INT64)skip=(dv.c<=sv.c);
- ei(dt<=TY_PTR)skip=(dv.p<=sv.p);
- else skip=(dv.x<=sv.x);
- }ei(op=='l'){
- if(dt<=TY_INT64)skip=(dv.c>=sv.c);
- ei(dt<=TY_PTR)skip=(dv.p>=sv.p);
- else skip=(dv.x>=sv.x);
- }ei(op=='!'){
- if(dt<=TY_INT64)skip=(dv.c==sv.c);
- ei(dt<=TY_PTR)skip=(dv.p==sv.p);
- else skip=(dv.x==sv.x);
- }else Die("Bad Operator");
- if(skip){
- Log("condition false, skipping");
- wh(*g&&*g!='#')g++;
- if(*g)g++;
- }
- }
- hell:
- Log("end");
- }
- int scrip7rc(FILE *in,void*data){
- char *cmd=s7getcmd(in);
- if(*cmd==0){free(cmd);return 0;}
- scrip7(cmd,data);
- if(s7freeflag)free(cmd);
- return 1;
- }
- void scrip7f(FILE *f,void*data){
- wh(!feof(f))scrip7rc(f,data);
- }
- void scrip7cli(FILE *in,void*data){
- scrip7("",data);
- wh(!feof(in)&&scrip7rc(in,0));
- }
- #if !defined(NOS7MAIN)&&!defined(S7IDE)
- __attribute__((weak)) int main(int argc,char **argv){
- char *data=malloc(1000);
- int i=argc,cli=(i==1);
- wh(i>1){
- i--;
- FILE *f=fopen(argv[i],"r");
- if(!f){
- if(strchr(argv[i],'d'))s7logflag=1;
- if(strchr(argv[i],'f'))s7freeflag=1;
- if(strchr(argv[i],'c'))cli=1;
- continue;
- }
- scrip7f(f,data);
- fclose(f);
- }
- if(cli)scrip7cli(stdin,data);
- return 0;
- }
- #endif
- #ifdef S7IDE
- #include <ncurses.h>
- #define ALT 0x800
- #define BRIGHTCYAN (COLOR_PAIR(2)|A_BOLD)
- #define BRIGHTRED (COLOR_PAIR(1)|A_BOLD)
- #define BRIGHTGOLD (COLOR_PAIR(3)|A_BOLD)
- int arrayview=0;/*0=chars 1=hex*/
- #define MAXARRVIEW 8
- void drawvars(){
- int i,j;
- for(i=0;i<6;i++){
- if(arrayview==0){for(j=0;j<COLS;j++){
- uint8_t k = globa7.v[i][j];
- uint8_t kk= k&0x7f;
- if(kk<32)kk=kk+'@';
- mvaddch(i+1,j,((k&0x7f)<' '?A_REVERSE:0)
- |(k&0x80?BRIGHTRED:0)|kk);
- }}ei(arrayview==1){for(j=0;j<COLS/2;j++){
- uint8_t k = globa7.v[i][j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*2,"%02x",k);
- attrset(COLOR_PAIR(0));
- }}ei(arrayview==2){for(j=0;j<COLS/4;j++){
- int8_t k = ((int8_t*)globa7.v[i])[j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*4,"%+4"PRId8,k);
- attrset(COLOR_PAIR(0));
- }}ei(arrayview==3){for(j=0;j<COLS/6;j++){
- int16_t k = ((int16_t*)globa7.v[i])[j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*6,"%+6"PRId16,k);
- attrset(COLOR_PAIR(0));
- }}ei(arrayview==4){for(j=0;j<COLS/11;j++){
- int32_t k = ((int32_t*)globa7.v[i])[j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*11,"%+11"PRId32,k);
- attrset(COLOR_PAIR(0));
- }}ei(arrayview==5){for(j=0;j<COLS/20;j++){
- int64_t k = ((int64_t*)globa7.v[i])[j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*20,"%+20"PRId64,k);
- attrset(COLOR_PAIR(0));
- }}ei(arrayview==6){for(j=0;j<COLS/15;j++){
- float k = ((float*)globa7.v[i])[j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*15,"%.6g",k);
- attrset(COLOR_PAIR(0));
- }}ei(arrayview==7){for(j=0;j<COLS/25;j++){
- double k = ((double*)globa7.v[i])[j];
- attrset(j&1?BRIGHTCYAN:COLOR_PAIR(0));
- mvprintw(i+1,j*25,"%.15g",k);
- attrset(COLOR_PAIR(0));
- }}
- }
- }
- int main(){
- initscr();
- cbreak();
- noecho();
- keypad(stdscr,TRUE);
- meta(stdscr,TRUE);
- start_color();
- use_default_colors();
- init_pair(1,COLOR_RED,-1);
- init_pair(2,COLOR_CYAN,-1);
- init_pair(3,COLOR_YELLOW,-1);
- int y=0,x=0;//cursor position
- char interactive[1000]="";
- char data[1000];
- scrip7("",data);
- loop{
- erase();
- int xp = x>COLS/2?x-COLS/2:0;
- int len = strlen(interactive);
- mvprintw(0,0,"%*s",(len-xp>COLS)?COLS:len-xp,interactive+xp);
- drawvars();
- int c=mvgetch(0,x>COLS/2?COLS/2:x);
- if(c==EOF||c==ERR)break;
- if(c==27){
- c=ALT|getch();
- }ei(c==(KEY_RIGHT)){
- if(x<(int)strlen(interactive))x++;
- }ei(c==KEY_LEFT){
- if(x>0)x--;
- }ei(c==KEY_BACKSPACE){if(x>0){
- memmove(interactive+x-1,interactive+x,len-x+1);
- x--;
- }}ei(c=='A'-'@'){
- arrayview++;
- arrayview%=MAXARRVIEW;
- }ei(c=='\n'){
- clear();
- move(7,0);
- refresh();
- scrip7(interactive,0);
- interactive[0]=0;x=0;
- }ei(c>=' '&&c<='~'){
- memmove(interactive+x+1,interactive+x,len-x+1);
- interactive[x]=c;
- x++;
- }
- }
- endwin();
- return 0;
- }
- #endif
- #endif
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement