home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / WWIVSOR.ZIP / GFLEDIT.C < prev    next >
C/C++ Source or Header  |  1995-04-25  |  9KB  |  411 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1995 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <dir.h>
  22.  
  23.  
  24.  
  25. #define utoa(s,v,r) ultoa((unsigned long)(s),v,r)
  26.  
  27.  
  28. void gfiledata(int n, char *s)
  29. {
  30.   char x,i;
  31.   gfiledirrec r;
  32.  
  33.   r=gfilesec[n];
  34.   if (r.ar==0)
  35.     x=32;
  36.   else {
  37.     for (i=0; i<16; i++)
  38.       if ((1 << i) & r.ar)
  39.         x='A'+i;
  40.   }
  41.   sprintf(s,"%2d %1c  %-40s  %-8s %-3d %-3d %-3d",
  42.             n,x,stripcolors(r.name),r.filename,r.sl,r.age,r.maxfiles);
  43. }
  44.  
  45. void showsec(void)
  46. {
  47.   int abort,i;
  48.   char s[180];
  49.  
  50.   outchr(12);
  51.   abort=0;
  52.   pla(get_string(60),
  53.       &abort);
  54.   pla(get_string(61),
  55.       &abort);
  56.   for (i=0; (i<num_sec) && (!abort); i++) {
  57.     gfiledata(i,s);
  58.     pla(s,&abort);
  59.   }
  60. }
  61.  
  62.  
  63. int exist_dir(char *s)
  64. {
  65.   int ok;
  66.  
  67.   cd_to(syscfg.gfilesdir);
  68.   if (chdir(s))
  69.     ok=0;
  70.   else
  71.     ok=1;
  72.   cd_to(cdir);
  73.   return(ok);
  74. }
  75.  
  76.  
  77. void modify_sec(int n)
  78. {
  79.   gfiledirrec r;
  80.   char s[81],ch,ch2;
  81.   int i,done;
  82.  
  83.   r=gfilesec[n];
  84.   done=0;
  85.   do {
  86.     outchr(12);
  87.     outstr(get_string(62)); pl(r.name);
  88.     outstr(get_string(63)); pl(r.filename);
  89.     outstr(get_string(64)); pln(r.sl);
  90.     outstr(get_string(65)); pln(r.age);
  91.     outstr(get_string(66)); pln(r.maxfiles);
  92.     strcpy(s,get_string(5));
  93.     if (r.ar!=0) {
  94.       for (i=0; i<16; i++)
  95.         if ((1 << i) & r.ar)
  96.           s[0]='A'+i;
  97.       s[1]=0;
  98.     }
  99.     outstr(get_string(67)); pl(s);
  100.     nl();
  101.     prt(2,get_string(68));
  102.     ch=onek("QABCDEF[]");
  103.     switch(ch) {
  104.       case 'Q':done=1; break;
  105.       case '[':
  106.         gfilesec[n]=r;
  107.         if (--n<0)
  108.           n=num_sec-1;
  109.         r=gfilesec[n];
  110.         break;
  111.       case ']':
  112.         gfilesec[n]=r;
  113.         if (++n>=num_sec)
  114.           n=0;
  115.         r=gfilesec[n];
  116.         break;
  117.       case 'A':
  118.         nl();
  119.         prt(2,get_string(69));
  120.         inputl(s,40);
  121.         if (s[0])
  122.           strcpy(r.name,s);
  123.         break;
  124.       case 'B':
  125.         nl();
  126.         if (exist_dir(r.filename)) {
  127.           nl();
  128.           pl(get_string(70));
  129.           pl(get_string(71));
  130.           nl();
  131.         }
  132.         nl();
  133.         prt(2,get_string(72));
  134.         input(s,8);
  135.         if ((s[0]!=0) && (strchr(s,'.')==0)) {
  136.           strcpy(r.filename,s);
  137.           if (!exist_dir(r.filename)) {
  138.             nl();
  139.             prt(5,get_string(73));
  140.             if (yn()) {
  141.               cd_to(syscfg.gfilesdir);
  142.               mkdir(r.filename);
  143.               cd_to(cdir);
  144.             } else {
  145.               nl();
  146.               pl(get_string(74));
  147.               nl();
  148.             }
  149.           } else {
  150.             nl();
  151.             pl(get_string(75));
  152.             nl();
  153.           }
  154.           pausescr();
  155.         }
  156.         break;
  157.       case 'C':
  158.         nl();
  159.         prt(2,get_string(76));
  160.         input(s,3);
  161.         i=atoi(s);
  162.         if ((i>=0) && (i<256) && (s[0]))
  163.           r.sl=i;
  164.         break;
  165.       case 'D':
  166.         nl();
  167.         prt(2,get_string(77));
  168.         input(s,3);
  169.         i=atoi(s);
  170.         if ((i>=0) && (i<128) && (s[0]))
  171.           r.age=i;
  172.         break;
  173.       case 'E':
  174.         nl();
  175.         pl(get_string(78));
  176.         prt(2,get_string(79));
  177.         input(s,3);
  178.         i=atoi(s);
  179.         if ((i>=0) && (i<99) && (s[0]))
  180.           r.maxfiles=i;
  181.         break;
  182.       case 'F':
  183.         nl();
  184.         prt(2,get_string(80));
  185.         ch2=onek("ABCDEFGHIJKLMNOP ");
  186.         if (ch2==32)
  187.           r.ar=0;
  188.         else
  189.           r.ar=1 << (ch2-'A');
  190.         break;
  191.     }
  192.   } while ((!done) && (!hangup));
  193.   gfilesec[n]=r;
  194. }
  195.  
  196.  
  197. void insert_sec(int n)
  198. {
  199.   gfiledirrec r;
  200.   int i;
  201.  
  202.   for (i=num_sec-1; i>=n; i--)
  203.     gfilesec[i+1]=gfilesec[i];
  204.   strcpy(r.name,get_string(81));
  205.   strcpy(r.filename,get_string(82));
  206.   r.sl=10;
  207.   r.age=0;
  208.   r.maxfiles=99;
  209.   r.ar=0;
  210.   gfilesec[n]=r;
  211.   ++num_sec;
  212.   modify_sec(n);
  213. }
  214.  
  215.  
  216. void delete_sec(int n)
  217. {
  218.   int i;
  219.  
  220.   for (i=n; i<num_sec; i++)
  221.     gfilesec[i]=gfilesec[i+1];
  222.   --num_sec;
  223. }
  224.  
  225.  
  226. void gfileedit(void)
  227. {
  228.   int i,done,f;
  229.   char s[81],ch;
  230.  
  231.   if (!checkpw())
  232.     return;
  233.   showsec();
  234.   done=0;
  235.   do {
  236.     nl();
  237.     prt(2,get_string(83));
  238.     ch=onek("QDIM?");
  239.     switch(ch) {
  240.       case '?':
  241.         showsec();
  242.         break;
  243.       case 'Q':
  244.         done=1;
  245.         break;
  246.       case 'M':
  247.         nl();
  248.         prt(2,get_string(84));
  249.         input(s,2);
  250.         i=atoi(s);
  251.         if ((s[0]!=0) && (i>=0) && (i<num_sec))
  252.           modify_sec(i);
  253.         break;
  254.       case 'I':
  255.         if (num_sec<sysinfo.max_gfilesec) {
  256.           nl();
  257.           prt(2,get_string(85));
  258.           input(s,2);
  259.           i=atoi(s);
  260.           if ((s[0]!=0) && (i>=0) && (i<=num_sec))
  261.             insert_sec(i);
  262.         }
  263.         break;
  264.       case 'D':
  265.         nl();
  266.         prt(2,get_string(86));
  267.         input(s,2);
  268.         i=atoi(s);
  269.         if ((s[0]!=0) && (i>=0) && (i<num_sec)) {
  270.           nl();
  271.           ansic(5);
  272.           outstr(get_string(87));
  273.           outstr(gfilesec[i].name);
  274.           outstr("? ");
  275.           if (yn())
  276.             delete_sec(i);
  277.         }
  278.         break;
  279.     }
  280.   } while ((!done) && (!hangup));
  281.   sprintf(s,"%sGFILE.DAT",syscfg.datadir);
  282.   f=sh_open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  283.   sh_write(f,(void *)(&gfilesec[0]), num_sec * sizeof(gfiledirrec));
  284.   sh_close(f);
  285. }
  286.  
  287.  
  288. int fill_sec(int sn)
  289. {
  290.   gfilerec *g,g1;
  291.   int f1,nf,ok,i,i1,chd;
  292.   char s[81],s1[81];
  293.   struct ffblk ff;
  294.  
  295.   g=read_sec(sn,&nf);
  296.   sprintf(s1,"%s%s\\*.*",syscfg.gfilesdir,gfilesec[sn].filename);
  297.   f1=findfirst(s1,&ff,0);
  298.   ok=1;
  299.   chd=0;
  300.   while ((f1==0) && (!hangup) && (nf<gfilesec[sn].maxfiles) && (ok)) {
  301.     strcpy(s,(ff.ff_name));
  302.     align(s);
  303.     i=1;
  304.     for (i1=0; i1<nf; i1++)
  305.       if (compare(s,g[i1].filename))
  306.         i=0;
  307.     if (i) {
  308.       ansic(2);
  309.       npr("%s : ",s);
  310.       inputl(s1,60);
  311.       if (s1[0]) {
  312.         chd=1;
  313.         i=0;
  314.         while ((strcmp(s1,g[i].description)>0) && (i<nf))
  315.           ++i;
  316.         for (i1=nf; i1>i; i1--)
  317.           g[i1]=g[i1-1];
  318.         ++nf;
  319.         strcpy(g1.filename,s);
  320.         strcpy(g1.description,s1);
  321.         time(&(g1.daten));
  322.         g[i]=g1;
  323.       } else
  324.         ok=0;
  325.     }
  326.     f1=findnext(&ff);
  327.   }
  328.   if (!ok)
  329.     pl(get_string(14));
  330.   if (nf>=gfilesec[sn].maxfiles)
  331.     pl(get_string(88));
  332.   if (chd) {
  333.     sprintf(s,"%s%s.GFL",syscfg.datadir,gfilesec[sn].filename);
  334.     i=sh_open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  335.     sh_write(i,(void *)g,nf*sizeof(gfilerec));
  336.     sh_close(i);
  337.     lock_status();
  338.     strcpy(status.gfiledate, date());
  339.     save_status();
  340.   }
  341.   bbsfree(g);
  342.   return(!ok);
  343. }
  344.  
  345. /****************************************************************************/
  346.  
  347. void pack_all_subs(void)
  348. {
  349.   int i=0, abort=0, next;
  350.  
  351.   tmp_disable_pause(1);
  352.   while ((!hangup) && (!abort) && (i<num_subs)) {
  353.     pack_sub(i);
  354.     checka(&abort,&next);
  355.     i++;
  356.   }
  357.   if (abort)
  358.     pl(get_string(14));
  359.   tmp_disable_pause(0);
  360. }
  361.  
  362. /****************************************************************************/
  363.  
  364. void pack_sub(int si)
  365. {
  366.   char *sfn, *nfn, *mt, fn1[81], fn2[81];
  367.   int i;
  368.   long l;
  369.   postrec *p;
  370.  
  371.   if (iscan1(si, 0)) {
  372.     if (open_sub(1)) {
  373.  
  374.       sfn=subboards[si].filename;
  375.       nfn="PACKTMP$";
  376.  
  377.       sprintf(fn1, "%s%s.DAT", syscfg.msgsdir, sfn);
  378.       sprintf(fn2, "%s%s.DAT", syscfg.msgsdir, nfn);
  379.  
  380.       npr("\r\n%s %s \r\n", get_string(1501), subboards[si].name);
  381.  
  382.       for (i=1; i<=nummsgs; i++) {
  383.         if (i%10==0)
  384.           npr("%u/%u\r", i, nummsgs);
  385.         p=get_post(i);
  386.         if (p) {
  387.           mt=readfile(&(p->msg), sfn, &l);
  388.           if (!mt) {
  389.             mt=malloca(10);
  390.             if (mt) {
  391.               strcpy(mt,"??");
  392.               l=3;
  393.             }
  394.           }
  395.           if (mt) {
  396.             savefile(mt, l, &(p->msg), nfn);
  397.             write_post(i, p);
  398.           }
  399.         }
  400.       }
  401.  
  402.       unlink(fn1);
  403.       rename(fn2, fn1);
  404.  
  405.       close_sub();
  406.       nln(2);
  407.       pl(get_string(1502));
  408.     }
  409.   }
  410. }
  411.