home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 1998 October / STC_CD_10_1998.iso / ONLINE / DFUE / DOTP118U / PLUGIN.C < prev    next >
C/C++ Source or Header  |  1998-09-26  |  12KB  |  450 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <standard.h>
  4. #include <string.h>
  5. #include <tos.h>
  6. #include <aes.h>
  7. #include <ext.h>
  8. #include "plugin.h"
  9. #include "plugidef.h"
  10.  
  11. typedef struct
  12. {
  13.     unsigned d_hour:   5;
  14.     unsigned d_min:    6;
  15.     unsigned d_tsec:   5;
  16. } DT;
  17.  
  18. typedef struct
  19. {
  20.     unsigned d_year:   7;
  21.     unsigned d_month:  4;
  22.     unsigned d_day:    5;
  23. }DD;
  24.  
  25. typedef union
  26. {
  27.     unsigned int i;
  28.     DT           dt;
  29. }DTIME;
  30.  
  31. typedef union
  32. {
  33.     unsigned int i;
  34.     DD           dd;
  35. }DDATE;
  36.  
  37. char vstr[20]="PlugIn 1.1.8 ╜ PN";
  38.  
  39. typedef struct{
  40.   char length;
  41.   char arg[255];
  42.   } MYCOMMAND;
  43.  
  44.   long err,size,p;
  45.   DTIME zeit;
  46.   DDATE dat;
  47.   MYCOMMAND cmdline;
  48.   int  cf,x,y,w,h;
  49.   char *buf,*s,*d,*e;
  50.   char cmdfile[128],cmd[128],path[128],name[10],logfile[128],tname[10];
  51.   char kstr[66],pstr1[66],pstr2[66],estr[40];
  52.   int  draw_info=0,wait_key=0,on_screen=0,dobreak=1,do_log=0;
  53.   char buffer[32*1024L];
  54.  
  55. long CopyFile(char *p1, char *p2)
  56. BEGIN
  57.   int f1,f2;
  58.   long anz;
  59.   
  60.   f1=(int)Fopen(p1,0);
  61.   IF f1<0 THEN return(f1); END
  62.   f2=(int)Fcreate(p2,0);
  63.   IF f2<0 THEN
  64.     Fclose(f1);
  65.     return(f2);
  66.   END
  67.   REPEAT
  68.     anz=Fread(f1,32*1024L,buffer);
  69.     Fwrite(f2,anz,buffer);
  70.   UNTIL(anz==0);
  71.   Fclose(f1); Fclose(f2);
  72.   return(0);
  73. END
  74.  
  75. long AppendFile(char *p1, char *p2)
  76. BEGIN
  77.   int f1,f2,exist,i;
  78.   long anz;
  79.   struct ffblk dta;
  80.   char sfile[128],*h;
  81.   
  82.   f2=(int)Fopen(p2,FO_WRITE);
  83.   IF f2<0 THEN f2=(int)Fcreate(p2,0); END
  84.   IF f2<0 THEN return(f2); END
  85.   strcpy(sfile,p1);
  86.   IF sfile[1]==':' THEN i=2; ELSE i=0; END
  87.   IF (h=strrchr(sfile,'\\'))!=0 THEN ++h; ELSE h=&sfile[i]; END
  88.   Fseek(0,f2,2);
  89.   exist=findfirst(p1,&dta,0);
  90.   WHILE exist==0 DO
  91.     *h=0;
  92.     strcat(sfile,dta.ff_name);
  93.     f1=(int)Fopen(sfile,0);
  94.     REPEAT
  95.       anz=Fread(f1,32*1024L,buffer);
  96.       Fwrite(f2,anz,buffer);
  97.     UNTIL(anz==0);
  98.     Fclose(f1);
  99.     exist=findnext(&dta);
  100.   END
  101.   Fclose(f2);
  102.   return(0);
  103. END
  104.  
  105. long DelFile(char *p1)
  106. BEGIN
  107.   int exist,i;
  108.   struct ffblk dta;
  109.   char sfile[128],*h;
  110.   long err;
  111.   
  112.   strcpy(sfile,p1);
  113.   IF sfile[1]==':' THEN i=2; ELSE i=0; END
  114.   IF (h=strrchr(sfile,'\\'))!=0 THEN ++h; ELSE h=&sfile[i]; END
  115.   exist=findfirst(p1,&dta,0);
  116.   WHILE exist==0 DO
  117.     *h=0;
  118.     strcat(sfile,dta.ff_name);
  119.     err=Fdelete(sfile);
  120.     IF err!=0 THEN return(err); END
  121.     exist=findnext(&dta);
  122.   END
  123.   return(0);
  124. END
  125.  
  126. char *strdel(char *s,long p,long n)
  127. BEGIN
  128.  long l;
  129.  
  130.  l=strlen(s);
  131.  if(p>=l) return(s);
  132.  IF (p+n)>=l THEN
  133.    s[p]='\0'; return(s);
  134.  END
  135.  memcpy(s+p,s+p+n,l-p+n);
  136.  return(s);
  137. END
  138.  
  139. char *strins(char *in,char *s,long p)
  140. BEGIN
  141.  long lin,ls;
  142.  
  143.  ls=strlen(s);
  144.  if(ls==0) return(strcpy(s,in));
  145.  if(p>=ls) return(strcat(s,in));
  146.  lin=strlen(in);
  147.  if(lin==0) return(s);
  148.  memcpy(s+p+lin,s+p,ls-p+1);
  149.  return(strncpy(s+p,in,lin));
  150. END
  151.  
  152. void PathDecode(char epath[])
  153. BEGIN
  154.   int i;
  155.   char *h;
  156.   static char p[128];
  157.   
  158.   strcpy(p,epath);
  159.   IF p[1]==':' THEN i=2; ELSE i=0; END
  160.   IF (h=strrchr(p,'\\'))!=0 THEN ++h; *h=0; ELSE p[i]=0; END
  161.   strcpy(path,p);
  162.   i=(int)strlen(p);
  163.   strcpy(p,epath);
  164.   h=strtok(&p[i],".");
  165.   name[0]=0;
  166.   IF h THEN strcpy(name,h); END
  167. END
  168.  
  169. void ShowCommand(void)
  170. BEGIN
  171.   IF draw_info THEN
  172.     strncpy(kstr,cmd,65);
  173.     strncpy(pstr1,cmdline.arg,65);
  174.     IF cmdline.length>65 THEN
  175.       strncpy(pstr2,&cmdline.arg[65],65);
  176.     ELSE
  177.       pstr2[0]=0;
  178.     END
  179.     estr[0]=0;
  180.     objc_draw(rs_trees[0],0,8,x,y,w,h);
  181.   END
  182.   IF do_log THEN
  183.     Cconws("Kommando: ");
  184.     Cconws(cmd); Cconout(' '); Cconws(cmdline.arg);
  185.     Cconout(13); Cconout(10);
  186.   END
  187. END
  188.  
  189. long main(int argc, char *argv[])
  190. BEGIN
  191.   int get_arg,lf=0,ifcnt=0,ignore=0;
  192.   
  193.   IF argc<2 THEN return(-1); END
  194.   appl_init();
  195.   _init_rsc();
  196.   IF argv[argc-1][strlen(argv[argc-1])-1]=='\\' THEN
  197.     get_arg=argc-2;  /* ZIP-Aufruf beim Auspacken */
  198.   ELSE
  199.     get_arg=argc-1;  /* alle sonstigen Fälle */
  200.   END
  201.   PathDecode(argv[get_arg]);
  202.   strcpy(cmdfile,path);
  203.   strcat(cmdfile,name);
  204.   cmdfile[strlen(cmdfile)-4]=0; /* Abschneiden auf IN bzw. OUT */
  205.   strcpy(logfile,cmdfile);
  206.   strcat(cmdfile,".CMD");
  207.   strcat(logfile,"_LOG.TXT");
  208.   cf=(int)Fopen(cmdfile,0);
  209.   IF cf<0 THEN                  /* Alternativ COMMAND.IN (OUT) */
  210.     strcpy(cmdfile,path);
  211.     strcat(cmdfile,"COMMAND.");
  212.     strcat(cmdfile,name);
  213.     cmdfile[strlen(cmdfile)-4]=0; /* Abschneiden auf IN bzw. OUT */
  214.     cf=(int)Fopen(cmdfile,0);
  215.     IF cf<0 THEN return(-2); END
  216.   END
  217.   size=Fseek(0,cf,2);
  218.   Fseek(0,cf,0);
  219.   buf=Malloc(size+1);
  220.   memset(buf,0,size+1);
  221.   Fread(cf,size,buf);
  222.   Fclose(cf);
  223.   s=buf;
  224.   form_center(rs_trees[0],&x,&y,&w,&h);
  225.   rs_trees[0][0].ob_y -= y-23;
  226.   y=23;
  227.   REPEAT
  228.     s=strchr(s,13);
  229.     IF s THEN *s=' '; END;
  230.   UNTIL(!s);
  231.   s=buf;
  232.   WHILE (d=strtok(s,"\n"))!=0 DO
  233.     s=0;
  234.     strcpy(cmd,d);
  235.     e=strchr(cmd,';');
  236.     IF e THEN *e=0; END
  237.     WHILE *cmd==' ' DO strdel(cmd,0,1); END
  238.     e=strchr(cmd,' ');
  239.     IF e THEN
  240.       *e=0; ++e;
  241.       strcpy(cmdline.arg,e);
  242.       e=cmdline.arg;
  243.       REPEAT
  244.         p=strcspn(e,"%");
  245.         IF e[p]=='%' THEN
  246.           int ind;
  247.           strdel(e,p,1);
  248.           CASE e[p] OF
  249.             WHEN '%' : e+=p+1;
  250.                        p=0;
  251.                        break;
  252.             WHEN 'n' :
  253.             WHEN 'N' : strdel(e,p,1);
  254.                        strins(name,e,p);
  255.                        e+=p+strlen(name);
  256.                        p=0;
  257.                        break;
  258.             WHEN 't' :
  259.             WHEN 'T' : strdel(e,p,1);
  260.                        zeit.i=Tgettime();
  261.                        dat.i =Tgetdate();
  262.                        tname[0]=(dat.dd.d_month / 10) + '0';
  263.                        tname[1]=(dat.dd.d_month % 10) + '0';
  264.                        tname[2]=(dat.dd.d_day / 10) + '0';
  265.                        tname[3]=(dat.dd.d_day % 10) + '0';
  266.                        tname[4]=(zeit.dt.d_hour / 10) + '0';
  267.                        tname[5]=(zeit.dt.d_hour % 10) + '0';
  268.                        tname[6]=(zeit.dt.d_min / 10) + '0';
  269.                        tname[7]=(zeit.dt.d_min % 10) + '0';
  270.                        tname[8]=0;
  271.                        strins(tname,e,p);
  272.                        e+=p+8;
  273.                        p=0;
  274.                        break;
  275.             WHEN 'p' :
  276.             WHEN 'P' : strdel(e,p,1);
  277.                        strins(path,e,p);
  278.                        e+=p+strlen(path);
  279.                        p=0;
  280.                        break;
  281.             WHEN '0' :
  282.             WHEN '1' :
  283.             WHEN '2' :
  284.             WHEN '3' :
  285.             WHEN '4' :
  286.             WHEN '5' :
  287.             WHEN '6' :
  288.             WHEN '7' :
  289.             WHEN '8' :
  290.             WHEN '9' : ind=e[p]-'0';
  291.                        IF ind<argc THEN
  292.                          strdel(e,p,1);
  293.                          strins(argv[ind],e,p);
  294.                          e+=p+strlen(argv[ind]);
  295.                        ELSE
  296.                          e[p]=' ';
  297.                          e+=p+1;
  298.                        END
  299.                        p=0;
  300.                        break;
  301.           END
  302.         END
  303.       UNTIL(e[p]==0);
  304.       cmdline.length=strlen(cmdline.arg);
  305.       IF cmdline.length>124 THEN   /* GEMDOS-Beschränkung */
  306.         cmdline.length=124;
  307.         cmdline.arg[124]=0;
  308.       END
  309.     ELSE
  310.       *cmdline.arg=0;
  311.       cmdline.length=0;
  312.     END
  313.     IF *cmd!=0 THEN
  314.       IF stricmp("#if",cmd)==0 THEN
  315.         ifcnt++;
  316.         IF !ignore THEN
  317.           ShowCommand();
  318.           IF err!=atol(cmdline.arg) THEN ignore=ifcnt; END
  319.         END
  320.       ELSIF stricmp("#else",cmd)==0 THEN
  321.         IF ignore==0 THEN
  322.           ShowCommand();
  323.           ignore=ifcnt;
  324.         ELSIF ignore==ifcnt THEN
  325.           ignore=0;
  326.         END
  327.       ELSIF stricmp("#elsif",cmd)==0 THEN
  328.         IF ignore==0 THEN
  329.           ignore=ifcnt;
  330.         ELSIF ignore==ifcnt THEN
  331.           ShowCommand();
  332.           IF err==atol(cmdline.arg) THEN ignore=0; END
  333.         END
  334.       ELSIF stricmp("#endif",cmd)==0 THEN
  335.         IF ignore==ifcnt THEN ignore=0; ShowCommand(); END
  336.         ifcnt--;
  337.       ELSIF !ignore THEN
  338.           err=0;
  339.           ShowCommand();
  340.           IF stricmp("#ren",cmd)==0 THEN
  341.             char *p1,*p2;
  342.             
  343.             p1=cmdline.arg;
  344.             p2=strchr(cmdline.arg,' ');
  345.             *p2=0; p2++;
  346.             WHILE *p2==' ' DO strdel(p2,0,1); END
  347.             err=Frename(0,p1,p2);
  348.           ELSIF stricmp("#del",cmd)==0 THEN
  349.             err=DelFile(cmdline.arg);
  350.           ELSIF stricmp("#log",cmd)==0 THEN
  351.             do_log=(cmdline.arg[0]=='+');
  352.             IF lf<=0 THEN
  353.               Fdelete(logfile);
  354.               lf=(int)Fcreate(logfile,0);
  355.               IF lf<0 THEN 
  356.                 do_log=FALSE;
  357.               ELSE
  358.                 Fforce(1,lf);
  359.               END
  360.             END
  361.             IF do_log THEN
  362.               Cconws("Kommando: ");
  363.               Cconws(cmd); Cconout(' '); Cconws(cmdline.arg);
  364.               Cconout(13); Cconout(10);
  365.             END
  366.           ELSIF stricmp("#info",cmd)==0 THEN
  367.             draw_info=(cmdline.arg[0]=='+');
  368.             IF draw_info && (!on_screen) THEN
  369.               form_dial(FMD_START,x,y,w,h,x,y,w,h);
  370.               objc_draw(rs_trees[0],0,8,x,y,w,h);
  371.               on_screen=TRUE;
  372.             END
  373.           ELSIF stricmp("#wait",cmd)==0 THEN
  374.             wait_key=(cmdline.arg[0]=='+');
  375.           ELSIF stricmp("#exit",cmd)==0 THEN
  376.             err=atol(cmdline.arg);
  377.             IF draw_info THEN form_dial(FMD_FINISH,x,y,w,h,x,y,w,h); END
  378.             IF do_log THEN Fclose(lf); END
  379.             appl_exit();
  380.             return(err);
  381.           ELSIF stricmp("#break",cmd)==0 THEN
  382.             dobreak=(cmdline.arg[0]=='+');
  383.           ELSIF stricmp("#alert",cmd)==0 THEN
  384.             err=form_alert(1,cmdline.arg)-1;
  385.           ELSIF (stricmp("#cd",cmd)==0) && (cmdline.length>1) THEN
  386.             char *hp;
  387.             strupr(cmdline.arg);
  388.             IF cmdline.arg[1]==':' THEN
  389.               Dsetdrv(cmdline.arg[0]-'A');
  390.             END
  391.             hp=strchr(cmdline.arg,' ');
  392.             IF hp THEN *hp=0; END
  393.             err=Dsetpath(cmdline.arg);
  394.             IF do_log THEN
  395.               char ap[128];
  396.               Cconws(" Gesetzt: ");
  397.               Cconout(Dgetdrv()+'A'); Cconout(':');
  398.               Dgetpath(ap,0);
  399.               Cconws(ap);
  400.             END
  401.           ELSIF stricmp("#copy",cmd)==0 THEN
  402.             char *p1,*p2;
  403.             
  404.             p1=cmdline.arg;
  405.             p2=strchr(cmdline.arg,' ');
  406.             *p2=0; p2++;
  407.             WHILE *p2==' ' DO strdel(p2,0,1); END
  408.             err=CopyFile(p1,p2);
  409.           ELSIF stricmp("#append",cmd)==0 THEN
  410.             char *p1,*p2;
  411.             
  412.             p1=cmdline.arg;
  413.             p2=strchr(cmdline.arg,' ');
  414.             *p2=0; p2++;
  415.             WHILE *p2==' ' DO strdel(p2,0,1); END
  416.             err=AppendFile(p1,p2);
  417.           ELSE
  418.             err=Pexec(0,cmd,(COMMAND *)&cmdline,"");
  419.           END
  420.           ltoa(err,estr,10);
  421.           IF draw_info THEN
  422.             objc_draw(rs_trees[0],MAERG,1,x,y,w,h);
  423.           END
  424.           IF do_log THEN
  425.             Cconout(13); Cconout(10);
  426.             Cconws(" --> "); Cconws(estr);
  427.             Cconout(13); Cconout(10);
  428.             Cconout(13); Cconout(10);
  429.           END
  430.           IF wait_key && draw_info THEN
  431.             form_alert(1,"[1][PlugIn:|Bitte RETURN drücken.][ Weiter ]");
  432.           END
  433.           IF err && dobreak THEN 
  434.             IF draw_info THEN form_dial(FMD_FINISH,x,y,w,h,x,y,w,h); END
  435.             IF do_log THEN Fclose(lf); END
  436.             appl_exit();
  437.             return(err);
  438.           END
  439.         END
  440.     END
  441.   END
  442.   IF draw_info THEN form_dial(FMD_FINISH,x,y,w,h,x,y,w,h); END
  443.   IF do_log THEN Fclose(lf); END
  444.   appl_exit();
  445.   Mfree(buf);
  446.   return(0);
  447. END
  448.   
  449.   
  450.