home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / xdev_118.arj / INDEXER.C next >
C/C++ Source or Header  |  1992-01-18  |  5KB  |  226 lines

  1. /*
  2.  *
  3.  * Prompt file indexer for XBBS
  4.  * revised for speed and sysop error checking 01/17/92
  5.  *
  6.  */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <dir.h>
  12. #include <io.h>
  13. #include <fcntl.h>
  14. #include <stdlib.h>
  15. #include <sys/types.h>
  16. #include <sys/stat.h>
  17.  
  18. char * pascal fgetsx (char *str,int num,int handle);
  19.  
  20.  
  21.  
  22. int main (void) {
  23.  
  24.   int                   hfp,idxfp;
  25.   unsigned int          last = 0;
  26.   struct stat           f;
  27.   char                  lineh[513],bell = 0;
  28.   char                  s[33],*p,*fn,ofn[133];
  29.     register unsigned int x;
  30.   long                  pos,line = 0L;
  31.  
  32.  
  33.   fn = searchpath("XBBS.TXT");
  34.   if (!fn || stat (fn,&f)) {
  35.         fputs("\nCan't find XBBS.TXT\n",stdout);
  36.     return(1);
  37.     }
  38.  
  39.   strcpy(ofn,fn);
  40.  
  41.   if (f.st_size < 1L) {
  42.         fputs("\nXBBS.TXT is null length\n",stdout);
  43.     return(1);
  44.     }
  45.  
  46.   if ((hfp = _open(ofn,O_RDONLY | O_TEXT | O_DENYNONE)) == -1) {
  47.         fputs("\nCan't open XBBS.TXT\n",stdout);
  48.     return(1);
  49.     }
  50.  
  51.   fn = searchpath("XBBS.IDX");
  52.   if(fn) unlink(fn);
  53.   else {
  54.     p = strrchr(ofn,'\\');
  55.     if(p) {
  56.       p++;
  57.       *p = 0;
  58.     }
  59.     strcat(ofn,"XBBS.IDX");
  60.     fn = ofn;
  61.   }
  62.  
  63.   if ((idxfp = creat(fn,S_IWRITE)) == -1) {
  64.         fputs("\nCan't create XBBS.IDX\n",stdout);
  65.         _close(hfp);
  66.         return(1);
  67.     }
  68.  
  69.   fputs("\nIndexing XBBS.TXT...\n",stdout);
  70.  
  71.   if (fgetsx(lineh,513,hfp) == NULL) strcpy(lineh,"\01 END");
  72.   line++;
  73.   x = 0;
  74.   for(;;) {
  75.     if (strncmp(lineh,"\01 END",5) == 0) break;
  76.     if (*lineh != '\01') {
  77.             continue;
  78.         }
  79.     last = atoi(&lineh[1]);
  80.     if((!last && lineh[1] != '0') || (last != x)) {
  81.       if(!bell) {
  82.         putchar('\07');
  83.         bell++;
  84.       }
  85.       fputs("\nWarning:  possible grunging in prompt file, line #",stderr);
  86.       fputs(ltoa(line,s,10),stderr);
  87.       fputs(", last prompt #",stderr);
  88.       fputs(itoa(x,s,10),stderr);
  89.       fputs("\n",stderr);
  90.       fputs(lineh,stderr);
  91.     }
  92.     pos = tell(hfp);
  93.         _write(idxfp,&pos,sizeof(long));
  94.     if (fgetsx(lineh,513,hfp) == NULL) strcpy(lineh,"\01 END");
  95.     line++;
  96.     while(*lineh != '\01') {
  97.       if (fgetsx(lineh,513,hfp) == NULL) strcpy(lineh,"\01 END");
  98.       line++;
  99.         }
  100.     if(!(x % 5)) {
  101.       fputs(itoa(x,s,10),stdout);
  102.       putchar('\r');
  103.     }
  104.     x++;
  105.     }
  106.   _close(hfp);
  107.     _close(idxfp);
  108.  
  109.  
  110.   bell = 0;
  111.   line = 0L;
  112.   fn = searchpath("XBBS.GXT");
  113.   if (!fn || stat (fn,&f)) {
  114.     fputs("\nCan't find XBBS.GXT\n",stdout);
  115.     return(0);
  116.     }
  117.  
  118.   strcpy(ofn,fn);
  119.  
  120.   if (f.st_size < 1L) {
  121.         fputs("\nXBBS.GXT is null length\n",stdout);
  122.     return(0);
  123.     }
  124.  
  125.   if ((hfp = _open(ofn,O_RDONLY | O_TEXT | O_DENYNONE))==-1) {
  126.         fputs("\nCan't open XBBS.GXT\n",stdout);
  127.     return(0);
  128.     }
  129.  
  130.   fn = searchpath("XBBS.GDX");
  131.   if(fn) unlink(fn);
  132.   else {
  133.     p = strrchr(ofn,'\\');
  134.     if(p) {
  135.       p++;
  136.       *p = 0;
  137.     }
  138.     strcat(ofn,"XBBS.GDX");
  139.     fn = ofn;
  140.   }
  141.  
  142.   if ((idxfp = creat(fn,S_IWRITE)) == -1) {
  143.     fputs("\nCan't create XBBS.GDX\n",stdout);
  144.     _close(hfp);
  145.     return(0);
  146.     }
  147.  
  148.     fputs("\nIndexing XBBS.GXT...\n",stdout);
  149.  
  150.   if (fgetsx(lineh,513,hfp) == NULL) strcpy(lineh,"\01 END");
  151.   line++;
  152.   x = 0;
  153.   for(;;) {
  154.     if (strncmp(lineh,"\x1 END",5) == 0) break;
  155.     if (*lineh != '\01') {
  156.             continue;
  157.         }
  158.     last = atoi(&lineh[1]);
  159.     if((!last && lineh[1] != '0') || (last != x)) {
  160.       if(!bell) {
  161.         putchar('\07');
  162.         bell++;
  163.       }
  164.       fputs("\nWarning:  possible grunging in prompt file, line #",stderr);
  165.       fputs(ltoa(line,s,10),stderr);
  166.       fputs(", last prompt #",stderr);
  167.       fputs(itoa(x,s,10),stderr);
  168.       fputs("\n",stderr);
  169.       fputs(lineh,stderr);
  170.     }
  171.     pos = tell(hfp);
  172.         _write(idxfp,&pos,sizeof(long));
  173.     if (fgetsx(lineh,513,hfp) == NULL) strcpy(lineh,"\01 END");
  174.     line++;
  175.     while(*lineh != '\01') {
  176.       if (fgetsx(lineh,513,hfp) == NULL) strcpy(lineh,"\01 END");
  177.       line++;
  178.         }
  179.     if(!(x % 5)) {
  180.       fputs(itoa(x,s,10),stdout);
  181.       putchar('\r');
  182.     }
  183.     x++;
  184.     }
  185.   _close(hfp);
  186.     _close(idxfp);
  187.  
  188.   return 0;
  189. }
  190.  
  191.  
  192.  
  193.  
  194. char * pascal fgetsx (char *str,int num,int handle) {
  195.  
  196.     static char *p;
  197.     static long pos;
  198.     static int x;
  199.  
  200.     if (eof(handle)) {
  201.         *str = 0;
  202.         return NULL;
  203.     }
  204.     pos = tell(handle);
  205.     x = _read(handle,str,num - 1);
  206.     if (x < 1) {
  207.         *str = 0;
  208.         return NULL;
  209.     }
  210.     str[x] = 0;
  211.     p = str;
  212.     while(*p && *p != '\r' && *p != '\n') p++;
  213.     if(!*p) return str;
  214.     if(*p == '\r') {
  215.         *p = '\n';
  216.         if (p[1] == '\n') {
  217.             p++;
  218.             *p = 0;
  219.         }
  220.     }
  221.     p++;
  222.     *p = 0;
  223.     lseek(handle,pos + ((long)((unsigned int)p - (unsigned int)str)),SEEK_SET);
  224.     return str;
  225. }
  226.