home *** CD-ROM | disk | FTP | other *** search
- #include <string.h>
- #include <stdlib.h>
- #include "msh.h"
- #include "primitiv.h"
-
- /* typical actions given here as example; add your own... */
-
- void Dup(void){Pushlong(1l);Pick();}
-
- void Swap(void){Pushlong(2l);Roll();}
-
- void Equal(void)
- { refobj s=Pop(),t=Pop();
- if(strcmp(s->val,t->val))Pushbool(FALSE);
- else Push(t);
- Free(t);Free(s);
- }
-
- void Not(void){Pushbool(!Popbool());}
-
- void Sum(void){Pushlong(Poplong()+Poplong());}
-
- void Minus(void){long a=Poplong();Pushlong(Poplong()-a);}
-
- void Times(void){Pushlong(Poplong()*Poplong());}
-
- void Divide(void){long a=Poplong();
- if(a==0)efns(WARNING_,"division by 0");else Pushlong(Poplong()/a);}
-
- void Lt(void){long a=Poplong();Pushbool(Poplong()<a);}
-
- void Le(void){long a=Poplong();Pushbool(Poplong()<=a);}
-
- void Ge(void){long a=Poplong();Pushbool(Poplong()>=a);}
-
- void Gt(void){long a=Poplong();Pushbool(Poplong()>a);}
-
- void Length(void){refobj s=Pop();Pushlong(strlen(s->val));Free(s);}
-
- void Substring(void)
- { long b=Poplong(),a=Poplong(); refobj s=Pop();
- int len=strlen(s->val);
- if(a<1 || b<1 || b<a || a>len || b>len)
- efns(WARNING_," substring: illegal range");
- else
- { char save=s->val[b];s->val[b]=0;Pushstring(s->val+a-1);s->val[b]=save;}
- Free(s);
- }
-
- void Cat(void)
- {refobj s=Pop(),t=Pop(),
- r=(refobj)malloc(sizeof(int)+1+strlen(s->val)+strlen(t->val));
- testalloc(r);
- strcpy(stpcpy(r->val,t->val),s->val);r->rc=0;Push(r);
- Free(t);Free(s);
- }
-
- void CutFirst(void)
- { refobj s=Pop(),t=Pop();
- char *c=strstr(t->val,s->val);
- if(NULL==c){Push(t);Pushbool(FALSE);}
- else{char save=*c;*c=0;Pushstring(t->val);*c=save;
- c+=strlen(s->val);Pushstring(c);}
- Free(s);Free(t);
- }
-
- void CutLast(void)
- { refobj s=Pop(),t=Pop();
- char *c=NULL,*d;
- for(d=t->val;d=strstr(d,s->val);d++)c=d;
- if(NULL==c){Push(t);Pushbool(FALSE);}
- else{char save=*c;*c=0;Pushstring(t->val);*c=save;
- c+=strlen(s->val);Pushstring(c);}
- Free(s);Free(t);
- }
-
- #include <io.h>
- void Unlink(void)
- { refobj s=Pop();
- unlink(s->val);
- Free(s);
- }
-
- #include <fcntl.h>
- void Read(void)
- { refobj name=Pop();
- int handle=open(name->val,O_RDONLY|O_TEXT);
- if(-1==handle)efns(WARNING_|FILE_,"could not open file `%s'",name->val);
- else
- { long flen=filelength(handle);
- if(flen>65534u-sizeof(int))
- efns(WARNING_,"file `%s' too big: %ld bytes",name->val,flen);
- else
- { refobj s=(refobj)malloc(sizeof(int)+1+(unsigned)flen);
- testalloc(s);s->rc=0;
- if(-1==(flen=read(handle,s->val,(unsigned)flen)))
- { efns(WARNING_|FILE_,"error reading file `%s'",name->val);Free(s);}
- else { s->val[flen]=0; Push(s);}
- }
- close(handle);
- }
- Free(name);
- }
-
- #include <sys/stat.h>
- void Write(void)
- { refobj name=Pop(),s=Pop();
- int handle=open(name->val,O_WRONLY|O_CREAT|O_APPEND|O_TEXT,S_IWRITE|S_IREAD);
- if(-1==handle)efns(WARNING_|FILE_,"could not open file `%s'",name->val);
- else
- { if(strlen(s->val)!=write(handle,s->val,strlen(s->val)))
- efns(WARNING_|FILE_,"error writing to file `%s'",name->val);
- close(handle);
- }
- Free(name);Free(s);
- }
-