home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / TEXT_SEC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  7.4 KB  |  201 lines

  1. #line 1 "TEXT_SEC.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6.  
  7. #define MAX_TXTSECS     500 /* Maximum number of text file sections     */
  8. #define MAX_TXTFILES    500 /* Maximum number of text files per section */
  9.  
  10. /****************************************************************************/
  11. /* General Text File Section.                                               */
  12. /* Called from function main_sec                                            */
  13. /* Returns 1 if no text sections available, 0 otherwise.                    */
  14. /****************************************************************************/
  15. char text_sec()
  16. {
  17.     char    str[256],usrsec[MAX_TXTSECS],usrsecs,cursec,usemenu
  18.             ,*file[MAX_TXTFILES],addpath[83],addstr[83],*buf,ch;
  19.     long    i,j;
  20.     long    l,length;
  21.     FILE    *stream;
  22.  
  23. // ch=getage(useron.birth); Removed 05/19/96
  24. for(i=j=0;i<total_txtsecs;i++) {
  25.     if(!chk_ar(txtsec[i]->ar,useron))
  26.         continue;
  27.     usrsec[j++]=i; }
  28. usrsecs=j;
  29. if(!usrsecs) {
  30.     bputs(text[NoTextSections]);
  31.     return(1); }
  32. action=NODE_RTXT;
  33. while(online) {
  34.     sprintf(str,"%sMENU\\TEXT_SEC.*",text_dir);
  35.     if(fexist(str))
  36.         menu("TEXT_SEC");
  37.     else {
  38.         bputs(text[TextSectionLstHdr]);
  39.         for(i=0;i<usrsecs && !msgabort();i++) {
  40.             sprintf(str,text[TextSectionLstFmt],i+1,txtsec[usrsec[i]]->name);
  41.             if(i<9) outchar(SP);
  42.             bputs(str); } }
  43.     ASYNC;
  44.     mnemonics(text[WhichTextSection]);
  45.     if((cursec=getnum(usrsecs))<1)
  46.         break;
  47.     cursec--;
  48.     while(online) {
  49.         sprintf(str,"%sMENU\\TEXT%u.*",text_dir,cursec+1);
  50.         if(fexist(str)) {
  51.             sprintf(str,"TEXT%u",cursec+1);
  52.             menu(str);
  53.             usemenu=1; }
  54.         else {
  55.             bprintf(text[TextFilesLstHdr],txtsec[usrsec[cursec]]->name);
  56.             usemenu=0; }
  57.         sprintf(str,"%sTEXT\\%s.IXT",data_dir,txtsec[usrsec[cursec]]->code);
  58.         j=0;
  59.         if(fexist(str)) {
  60.             if((stream=fnopen((int *)&i,str,O_RDONLY))==NULL) {
  61.                 errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
  62.                 return(0); }
  63.             while(!ferror(stream) && !msgabort()) {  /* file open too long */
  64.                 if(!fgets(str,81,stream))
  65.                     break;
  66.                 str[strlen(str)-2]=0;   /* chop off CRLF */
  67.                 if((file[j]=MALLOC(strlen(str)+1))==NULL) {
  68.                     errormsg(WHERE,ERR_ALLOC,nulstr,strlen(str)+1);
  69.                     continue; }
  70.                 strcpy(file[j],str);
  71.                 fgets(str,81,stream);
  72.                 if(!usemenu) bprintf(text[TextFilesLstFmt],j+1,str);
  73.                 j++; }
  74.             fclose(stream); }
  75.         ASYNC;
  76.         if(SYSOP) {
  77.             strcpy(str,"QARE?");
  78.             mnemonics(text[WhichTextFileSysop]); }
  79.         else {
  80.             strcpy(str,"Q?");
  81.             mnemonics(text[WhichTextFile]); }
  82.         i=getkeys(str,j);
  83.         if(!(i&0x80000000L)) {          /* no file number */
  84.             for(l=0;l<j;l++)
  85.                 FREE(file[l]);
  86.             if((i=='E' || i=='R') && !j)
  87.                 continue; }
  88.         if(i=='Q' || !i)
  89.             break;
  90.         if(i==-1) {  /* ctrl-c */
  91.             for(i=0;i<j;i++)
  92.                 FREE(file[i]);
  93.             return(0); }
  94.         if(i=='?')  /* ? means re-list */
  95.             continue;
  96.         if(i=='A') {    /* Add text file */
  97.             if(j) {
  98.                 bputs(text[AddTextFileBeforeWhich]);
  99.                 i=getnum(j+1);
  100.                 if(i<1)
  101.                     continue;
  102.                 i--;    /* number of file entries to skip */ }
  103.             else
  104.                 i=0;
  105.             bprintf(text[AddTextFilePath]
  106.                 ,data_dir,txtsec[usrsec[cursec]]->code);
  107.             if(!getstr(addpath,80,K_UPPER))
  108.                 continue;
  109.             strcat(addpath,crlf);
  110.             bputs(text[AddTextFileDesc]);
  111.             if(!getstr(addstr,74,0))
  112.                 continue;
  113.             strcat(addstr,crlf);
  114.             sprintf(str,"%sTEXT\\%s.IXT"
  115.                 ,data_dir,txtsec[usrsec[cursec]]->code);
  116.             if(i==j) {  /* just add to end */
  117.                 if((i=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) {
  118.                     errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT);
  119.                     return(0); }
  120.                 write(i,addpath,strlen(addpath));
  121.                 write(i,addstr,strlen(addstr));
  122.                 close(i);
  123.                 continue; }
  124.             j=i; /* inserting in middle of file */
  125.             if((stream=fnopen((int *)&i,str,O_RDWR))==NULL) {
  126.                 errormsg(WHERE,ERR_OPEN,str,O_RDWR);
  127.                 return(0); }
  128.             length=filelength(i);
  129.             for(i=0;i<j;i++) {  /* skip two lines for each entry */
  130.                 fgets(tmp,81,stream);
  131.                 fgets(tmp,81,stream); }
  132.             l=ftell(stream);
  133.             if((buf=(char *)MALLOC(length-l))==NULL) {
  134.                 fclose(stream);
  135.                 errormsg(WHERE,ERR_ALLOC,str,length-l);
  136.                 return(0); }
  137.             fread(buf,1,length-l,stream);
  138.             fseek(stream,l,SEEK_SET); /* go back to where we need to insert */
  139.             fputs(addpath,stream);
  140.             fputs(addstr,stream);
  141.             fwrite(buf,1,length-l,stream);
  142.             fclose(stream);
  143.             FREE(buf);
  144.             continue; }
  145.         if(i=='R' || i=='E') {   /* Remove or Edit text file */
  146.             ch=i;
  147.             if(ch=='R')
  148.                 bputs(text[RemoveWhichTextFile]);
  149.             else
  150.                 bputs(text[EditWhichTextFile]);
  151.             i=getnum(j);
  152.             if(i<1)
  153.                 continue;
  154.             sprintf(str,"%sTEXT\\%s.IXT"
  155.                 ,data_dir,txtsec[usrsec[cursec]]->code);
  156.             j=i-1;
  157.             if((stream=fnopen((int *)&i,str,O_RDONLY))==NULL) {
  158.                 errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
  159.                 return(0); }
  160.             // length=filelength(i); Removed 05/19/96
  161.             for(i=0;i<j;i++) {  /* skip two lines for each entry */
  162.                 fgets(tmp,81,stream);
  163.                 fgets(tmp,81,stream); }
  164.             fgets(addpath,81,stream);
  165.             truncsp(addpath);
  166.             fclose(stream);
  167.             if(!strchr(addpath,'\\'))
  168.                 sprintf(tmp,"%sTEXT\\%s\\%s"
  169.                     ,data_dir,txtsec[usrsec[cursec]]->code,addpath);
  170.             else
  171.                 strcpy(tmp,addpath);
  172.             if(ch=='R') {               /* Remove */
  173.                 if(fexist(tmp)) {
  174.                     sprintf(str,text[DeleteTextFileQ],tmp);
  175.                     if(!noyes(str))
  176.                         if(remove(tmp)) errormsg(WHERE,ERR_REMOVE,tmp,0); }
  177.                 sprintf(str,"%sTEXT\\%s.IXT"
  178.                     ,data_dir,txtsec[usrsec[cursec]]->code);
  179.                 removeline(str,addpath,2,0); }
  180.             else {                      /* Edit */
  181.                 strcpy(str,tmp);
  182.                 editfile(str); }
  183.             continue; }
  184.         i=(i&~0x80000000L)-1;
  185.         if(!strchr(file[i],'\\'))
  186.             sprintf(str,"%sTEXT\\%s\\%s"
  187.                 ,data_dir,txtsec[usrsec[cursec]]->code,file[i]);
  188.         else
  189.             strcpy(str,file[i]);
  190.         attr(LIGHTGRAY);
  191.         printfile(str,0);
  192.         sprintf(str,"Read Text File: %s",file[i]);
  193.         logline("T-",str);
  194.         pause();
  195.         sys_status&=~SS_ABORT;
  196.         for(i=0;i<j;i++)
  197.             FREE(file[i]); } }
  198. return(0);
  199. }
  200.  
  201.