home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / msh21.zip / TOOLKIT.ZIP / USERDEFS.C < prev   
C/C++ Source or Header  |  1992-08-17  |  5KB  |  173 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;d++)
  71.     c=d;
  72.   if(NULL==c){Push(t);Pushbool(FALSE);}
  73.   else{char save=*c;*c=0;Pushstring(t->val);*c=save;
  74.        c+=strlen(s->val);Pushstring(c);}
  75.   Free(s);Free(t);
  76. }
  77.  
  78. #include <io.h>
  79. #include <dos.h>
  80. #include <errno.h>
  81. void Unlink(void)
  82. { refobj s=Pop();
  83.   if(-1==unlink(s->val) && errno==EACCES)
  84.   { Pushstring("delete read-only file ");Pushstring(s->val);Cat();Ok();
  85.     if(Popbool()){_dos_setfileattr(s->val,0);unlink(s->val);}
  86.   }
  87.   Free(s);
  88. }
  89.  
  90. void Rename(void)
  91. { refobj s=Pop(),t=Pop();
  92.   if(rename(t->val,s->val))Pushbool(FALSE);
  93.   else Push(t);
  94.   Free(s);Free(t);
  95. }
  96.  
  97. #include <fcntl.h>
  98. void Read(void)
  99. { refobj name=Pop();
  100.   int handle=open(name->val,O_RDONLY|O_TEXT);
  101.   if(-1==handle)efns(WARNING_|FILE_,name->val);
  102.   else
  103.   { long flen=filelength(handle);
  104.     if(flen>65534u-sizeof(int))
  105.       efns(WARNING_,"file `%s' too big: %ld bytes",name->val,flen);
  106.     else
  107.     { refobj s=(refobj)malloc(sizeof(int)+1+(unsigned)flen);
  108.       testalloc(s);s->rc=0;
  109.       if(-1==(flen=read(handle,s->val,(unsigned)flen)))
  110.       { efns(WARNING_|FILE_,name->val);Free(s);}
  111.       else { s->val[flen]=0; Push(s);}
  112.     }
  113.     close(handle);
  114.   }
  115.   Free(name);
  116. }
  117.  
  118. #include <sys/stat.h>
  119. void Write(void)
  120. { refobj name=Pop(),s=Pop();
  121.   int handle=open(name->val,O_WRONLY|O_CREAT|O_APPEND|O_TEXT,S_IWRITE|S_IREAD);
  122.   if(-1==handle)efns(WARNING_|FILE_,name->val);
  123.   else
  124.   { if(strlen(s->val)!=write(handle,s->val,strlen(s->val)))
  125.      efns(WARNING_|FILE_,name->val);
  126.     close(handle);
  127.   }
  128.   Free(name);Free(s);
  129. }
  130.  
  131. void Copy(void)
  132. { refobj dest=Pop(),src=Pop();int desth,srch;bool res=TRUE;
  133.   unsigned attrs,datep,timep;
  134.   char *buf;unsigned sz=65528u,n;
  135.   desth=open(dest->val,O_WRONLY|O_CREAT|O_BINARY|O_TRUNC,S_IWRITE|S_IREAD);
  136.   if(-1==desth)efns(WARNING_|FILE_,dest->val);
  137.   srch=open(src->val,O_RDONLY|O_BINARY);
  138.   if(-1==srch)efns(WARNING_|FILE_,src->val);
  139.   _dos_getftime(srch,&datep,&timep);
  140.   while(NULL==(buf=malloc(sz)) && sz>4000)sz>>=1;
  141.   testalloc(buf);
  142.   while(n=read(srch,buf,sz))
  143.      if(n==(unsigned)-1 || write(desth,buf,n)!=n)
  144.      { if(n==(unsigned)-1)efns(WARNING_|FILE_,"while copying");
  145.        else efns(WARNING_,"target disk full while copying");
  146.        res=FALSE;
  147.        break;
  148.      }
  149.   free(buf);close(srch);close(desth);
  150.   if(res)
  151.   { _open(dest->val,O_WRONLY);_dos_setftime(desth,datep,timep);_close(desth);
  152.     _dos_getfileattr(src->val,&attrs);_dos_setfileattr(dest->val,attrs);
  153.     Push(dest);
  154.   }
  155.   else {unlink(dest->val);Pushbool(FALSE);}
  156.   Free(src);Free(dest);
  157. }
  158.  
  159. void Tempname(void)
  160. { refobj s;
  161.   Pushstring("MSXXXXXX");Cat();s=Pop();
  162.   mktemp(s->val);
  163.   Push(s);
  164. }
  165.  
  166. void Diskstats(void)
  167. { struct diskfree_t s;refobj d=Pop();strupr(d->val);
  168.   _dos_getdiskfree(d->val[0]?d->val[0]-'A'+1:0,&s);Free(d);
  169.   Pushlong((long)s.sectors_per_cluster*s.bytes_per_sector);
  170.   Pushlong((long)s.avail_clusters);
  171.   Pushlong((long)s.total_clusters);
  172. }
  173.