home *** CD-ROM | disk | FTP | other *** search
/ Boston 2 / boston-2.iso / DOS / HILFEN / SYSTEM / MSH / USERDEFS.C < prev    next >
C/C++ Source or Header  |  1993-12-01  |  3KB  |  117 lines

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include "msh.h"
  4. #include "primitiv.h"
  5.  
  6. /* typical actions given here as example; add your own... */
  7.  
  8. void Dup(void){Pushlong(1l);Pick();}
  9.  
  10. void Swap(void){Pushlong(2l);Roll();}
  11.  
  12. void Equal(void)
  13. { refobj s=Pop(),t=Pop();
  14.   if(strcmp(s->val,t->val))Pushbool(FALSE);
  15.   else Push(t);
  16.   Free(t);Free(s);
  17. }
  18.  
  19. void Not(void){Pushbool(!Popbool());}
  20.  
  21. void Sum(void){Pushlong(Poplong()+Poplong());}
  22.  
  23. void Minus(void){long a=Poplong();Pushlong(Poplong()-a);}
  24.  
  25. void Times(void){Pushlong(Poplong()*Poplong());}
  26.  
  27. void Divide(void){long a=Poplong();
  28.  if(a==0)efns(WARNING_,"division by 0");else Pushlong(Poplong()/a);}
  29.  
  30. void Lt(void){long a=Poplong();Pushbool(Poplong()<a);}
  31.  
  32. void Le(void){long a=Poplong();Pushbool(Poplong()<=a);}
  33.  
  34. void Ge(void){long a=Poplong();Pushbool(Poplong()>=a);}
  35.  
  36. void Gt(void){long a=Poplong();Pushbool(Poplong()>a);}
  37.  
  38. void Length(void){refobj s=Pop();Pushlong(strlen(s->val));Free(s);}
  39.  
  40. void Substring(void)
  41. { long b=Poplong(),a=Poplong(); refobj s=Pop();
  42.   int len=strlen(s->val);
  43.   if(a<1 || b<1 || b<a || a>len || b>len)
  44.    efns(WARNING_," substring: illegal range");
  45.   else
  46.   { char save=s->val[b];s->val[b]=0;Pushstring(s->val+a-1);s->val[b]=save;}
  47.   Free(s);
  48. }
  49.  
  50. void Cat(void)
  51. {refobj s=Pop(),t=Pop(),
  52.     r=(refobj)malloc(sizeof(int)+1+strlen(s->val)+strlen(t->val));
  53.  testalloc(r);
  54.  strcpy(stpcpy(r->val,t->val),s->val);r->rc=0;Push(r);
  55.  Free(t);Free(s);
  56. }
  57.  
  58. void CutFirst(void)
  59. { refobj s=Pop(),t=Pop();
  60.   char *c=strstr(t->val,s->val);
  61.   if(NULL==c){Push(t);Pushbool(FALSE);}
  62.   else{char save=*c;*c=0;Pushstring(t->val);*c=save;
  63.        c+=strlen(s->val);Pushstring(c);}
  64.   Free(s);Free(t);
  65. }
  66.  
  67. void CutLast(void)
  68. { refobj s=Pop(),t=Pop();
  69.   char *c=NULL,*d;
  70.   for(d=t->val;d=strstr(d,s->val);d++)c=d;
  71.   if(NULL==c){Push(t);Pushbool(FALSE);}
  72.   else{char save=*c;*c=0;Pushstring(t->val);*c=save;
  73.        c+=strlen(s->val);Pushstring(c);}
  74.   Free(s);Free(t);
  75. }
  76.  
  77. #include <io.h>
  78. void Unlink(void)
  79. { refobj s=Pop();
  80.   unlink(s->val);
  81.   Free(s);
  82. }
  83.  
  84. #include <fcntl.h>
  85. void Read(void)
  86. { refobj name=Pop();
  87.   int handle=open(name->val,O_RDONLY|O_TEXT);
  88.   if(-1==handle)efns(WARNING_|FILE_,"could not open file `%s'",name->val);
  89.   else
  90.   { long flen=filelength(handle);
  91.     if(flen>65534u-sizeof(int))
  92.       efns(WARNING_,"file `%s' too big: %ld bytes",name->val,flen);
  93.     else
  94.     { refobj s=(refobj)malloc(sizeof(int)+1+(unsigned)flen);
  95.       testalloc(s);s->rc=0;
  96.       if(-1==(flen=read(handle,s->val,(unsigned)flen)))
  97.       { efns(WARNING_|FILE_,"error reading file `%s'",name->val);Free(s);}
  98.       else { s->val[flen]=0; Push(s);}
  99.     }
  100.     close(handle);
  101.   }
  102.   Free(name);
  103. }
  104.  
  105. #include <sys/stat.h>
  106. void Write(void)
  107. { refobj name=Pop(),s=Pop();
  108.   int handle=open(name->val,O_WRONLY|O_CREAT|O_APPEND|O_TEXT,S_IWRITE|S_IREAD);
  109.   if(-1==handle)efns(WARNING_|FILE_,"could not open file `%s'",name->val);
  110.   else
  111.   { if(strlen(s->val)!=write(handle,s->val,strlen(s->val)))
  112.      efns(WARNING_|FILE_,"error writing to file `%s'",name->val);
  113.     close(handle);
  114.   }
  115.   Free(name);Free(s);
  116. }
  117.