home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / GFILES.C < prev    next >
Text File  |  1992-07-20  |  5KB  |  233 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. *****************************************************************************/
  7.  
  8. #include "vars.h"
  9. #pragma hdrstop
  10.  
  11. char *get_file(char *fn, long *len)
  12. {
  13.   int i;
  14.   char *s;
  15.  
  16.   i=open(fn,O_RDWR | O_BINARY);
  17.   if (i<0) {
  18.     *len=0L;
  19.     return(NULL);
  20.   }
  21.   if ((s=malloca(filelength(i)+50))==NULL) {
  22.     *len=0L;
  23.     close(i);
  24.     return(NULL);
  25.   }
  26.   *len=(long) read(i,(void *)s, filelength(i));
  27.   close(i);
  28.   return(s);
  29. }
  30.  
  31. gfilerec *read_sec(int sn, int *nf)
  32. {
  33.   gfilerec *g;
  34.   int f,i;
  35.   char s[81];
  36.  
  37.   i=sizeof(gfilerec)*(gfilesec[sn].maxfiles);
  38.   if ((g=malloca((long) i))==NULL) {
  39.     *nf=0;
  40.     return(NULL);
  41.   }
  42.   sprintf(s,"%s%s.GFL",syscfg.datadir,gfilesec[sn].filename);
  43.   f=open(s,O_RDWR | O_BINARY);
  44.   if (f<0)
  45.     *nf=0;
  46.   else
  47.     *nf=read(f,(void *)g,i)/sizeof(gfilerec);
  48.   close(f);
  49.   return(g);
  50. }
  51.  
  52. void list_sec(int *map, int nmap)
  53. {
  54.   int i,abort;
  55.   char s[81];
  56.  
  57.   abort=0;
  58.   pla("",&abort);
  59.   pla("",&abort);
  60.   pla("1G-Files sections available:",&abort);
  61.   pla("",&abort);
  62.   for (i=0; (i<nmap) && (!abort) && (!hangup); i++) {
  63.     sprintf(s,"7[1%2d7] 1%s",i+1, gfilesec[map[i]].name);
  64.     pla(s,&abort);
  65.   }
  66.   nl();
  67. }
  68.  
  69. void list_gfiles(gfilerec *g, int nf)
  70. {
  71.   int i,abort;
  72.   char s[81];
  73.  
  74.   abort=0;
  75.   pla("",&abort);
  76.   pla("",&abort);
  77.   pla("1G-Files in this section:",&abort);
  78.   pla("",&abort);
  79.   if ((nf==0) && (abort==0)) {
  80.     nl();
  81.     pl("6None.");
  82.     nl();
  83.   }
  84.   for (i=0; (i<nf) && (!abort) && (!hangup); i++) {
  85.     sprintf(s,"7[1%2d7] 1%s",i+1, g[i].description);
  86.     pla(s,&abort);
  87.   }
  88.   nl();
  89.   if ((!abort) && (cs())) {
  90.     pl("1A. Add G-files");
  91.     pl("1D. Delete G-files");
  92.     nl();
  93.   }
  94. }
  95.  
  96. void gfile_sec(int sn)
  97. {
  98.   gfilerec *g;
  99.   int i,done,nf,i1;
  100.   char xdc[81],*ss,*ss1,s[81];
  101.  
  102.   g=read_sec(sn,&nf);
  103.   if (g==NULL)
  104.     return;
  105.   strcpy(xdc,odc);
  106.   for (i=0; i<20; i++)
  107.     odc[i]=0;
  108.   for (i=1; i<=nf/10; i++)
  109.     odc[i-1]=i+'0';
  110.   list_gfiles(g,nf);
  111.   done=0;
  112.   while ((!done) && (!hangup)) {
  113.     nl();
  114.     tleft(1);
  115.     prt(2,"1Which G7-1file 7(1Q7=1Quit7) 1? ");
  116.     ss=mmkey(2);
  117.     i=atoi(ss);
  118.     if (strcmp(ss,"Q")==0)
  119.       done=1;
  120.     else
  121.       if ((strcmp(ss,"A")==0) && (cs())) {
  122.     farfree(g);
  123.     fill_sec(sn);
  124.         g=read_sec(sn,&nf);
  125.         if (g==NULL)
  126.           return;
  127.         for (i=0; i<20; i++)
  128.           odc[i]=0;
  129.         for (i=1; i<=nf/10; i++)
  130.           odc[i-1]=i+'0';
  131.       } else
  132.     if ((strcmp(ss,"D")==0) && (cs())) {
  133.       nl();
  134.       prt(2,"G-file number to delete? ");
  135.           ss1=mmkey(2);
  136.       i=atoi(ss1);
  137.       if ((i>0) && (i<=nf)) {
  138.             sprintf(s,"Remove %s? ",g[i-1].description);
  139.         prt(5,s);
  140.         if (yn()) {
  141.           prt(5,"Erase file too? ");
  142.           if (yn()) {
  143.                 sprintf(s,"%s%s\\%s",syscfg.gfilesdir,
  144.                       gfilesec[sn].filename,g[i-1].filename);
  145.         unlink(s);
  146.           }
  147.               for (i1=i; i1<nf; i1++)
  148.         g[i1-1]=g[i1];
  149.           --nf;
  150.               sprintf(s,"%s%s.GFL",syscfg.datadir,gfilesec[sn].filename);
  151.               i=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  152.               write(i,(void *)g,nf*sizeof(gfilerec));
  153.               close(i);
  154.               nl();
  155.           pl("Deleted.");
  156.           nl();
  157.         }
  158.       }
  159.     } else
  160.           if (strcmp(ss,"?")==0)
  161.         list_gfiles(g,nf);
  162.       else
  163.             if ((i>0) && (i<=nf)) {
  164.               sprintf(s,"%s\\%s",gfilesec[sn].filename,g[i-1].filename);
  165.           i1=printfile(s);
  166.           if (i1==0) {
  167.                 sprintf(s,"Read G-file '%s'",g[i-1].filename);
  168.             sysoplog(s);
  169.           }
  170.             }
  171.   }
  172.   farfree(g);
  173.   strcpy(odc,xdc);
  174. }
  175.  
  176. void gfiles()
  177. {
  178.   int i,i1,i2,done,abort,map[32],nmap,ok;
  179.   char s[81],s1[81],s2[81],*ss;
  180.  
  181.   done=0;
  182.   nmap=0;
  183.   for (i=0; i<20; i++)
  184.     odc[i]=0;
  185.   for (i=0; i<num_sec; i++) {
  186.     ok=1;
  187.     if (thisuser.age<gfilesec[i].age)
  188.       ok=0;
  189.     if (actsl<gfilesec[i].sl)
  190.       ok=0;
  191.     if (((thisuser.ar & gfilesec[i].ar)==0) && (gfilesec[i].ar))
  192.       ok=0;
  193.     if (ok) {
  194.       map[nmap++]=i;
  195.       if ((nmap % 10)==0)
  196.     odc[nmap/10-1]='0'+(nmap/10);
  197.     }
  198.   }
  199.   if (nmap==0) {
  200.     nl();
  201.     pl("No G-file sections available.");
  202.     nl();
  203.     return;
  204.   }
  205.   list_sec(map,nmap);
  206.   while ((!done) && (!hangup)) {
  207.     nl();
  208.     tleft(1);
  209.     prt(2,"1Which section 7(1Q7=1Quit7) 1? ");
  210.     ss=mmkey(2);
  211.     if (strcmp(ss,"Q")==0)
  212.       done=1;
  213.     else
  214.       if (strcmp(ss,"?")==0)
  215.     list_sec(map,nmap);
  216.       else
  217.     if ((strcmp(ss,"A")==0) && (cs())) {
  218.       i1=0;
  219.       for (i=0; (i<nmap) && (!i1); i++) {
  220.         nl();
  221.             npr("Now loading files for %s\r\n",gfilesec[map[i]].name);
  222.         nl();
  223.         i1=fill_sec(map[i]);
  224.       }
  225.     } else {
  226.           i=atoi(ss);
  227.           if ((i>0) && (i<=nmap)) {
  228.         gfile_sec(map[i-1]);
  229.           }
  230.         }
  231.   }
  232. }
  233.