home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD1.img / d1xx / d153 / dme / src / refs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-06-15  |  3.9 KB  |  179 lines

  1.  
  2. /*
  3.  *  REFS.C
  4.  *
  5.  *  Bringup a cross reference editor window.  The file S:dme.refs and
  6.  *  dme.refs in the current directory are searched for the reference.
  7.  *  If found, the file specified is searched and the segment specified
  8.  *  loaded as a new file in a new window.
  9.  */
  10.  
  11. #include "defs.h"
  12. #include <stdio.h>
  13.  
  14. extern char *breakout();
  15.  
  16. void
  17. do_refs()
  18. {
  19.     char str[256];
  20.     char *srch;
  21.     char *file;
  22.     char *estr;
  23.     long len;
  24.     int bcnt = 10;
  25.     register short i, j;
  26.     short slen, elen;
  27.     long xfi, xfj;
  28.     short tmph, tmpw;
  29.  
  30.     for (i = Ep->Column; Current[i] == ' '; ++i);     /*  skip spaces     */
  31.     for (j = i       ; ; ++j) {
  32.     if (Current[j] && Current[j] != ' ')
  33.         continue;
  34.     break;
  35.     }
  36.     j -= i;
  37.     if (j > 63)
  38.     j = 63;
  39.     bmov(Current+i, str, j);
  40.     str[j] = 0;
  41.     title("search .refs");
  42.     if (!searchref("s:dme.refs",    str,&srch,&file,&len,&estr) &&
  43.     !searchref("dme.refs",      str,&srch,&file,&len,&estr) &&
  44.     !searchref("df0:s/dme.refs",str,&srch,&file,&len,&estr) &&
  45.     !searchref("df1:s/dme.refs",str,&srch,&file,&len,&estr) &&
  46.     !searchref("df2:s/dme.refs",str,&srch,&file,&len,&estr) &&
  47.     !searchref("df3:s/dme.refs",str,&srch,&file,&len,&estr)
  48.     ) {
  49.     title("Reference not found");
  50.     return;
  51.     }
  52.     title("search file");
  53.     slen = strlen(srch);
  54.     if (estr)
  55.     elen = strlen(estr);
  56.     if (xfi = xfopen(file, "r", 4096)) {
  57.     short lenstr;
  58.     while ((lenstr = xefgets(xfi, str, 256)) >= 0) {
  59.         if (strncmp(str, srch, slen) == 0) {
  60.         title("load..");
  61.         if (xfj = xfopen("t:dme_ref", "w", 1024)) {
  62.             tmph = 0;
  63.             tmpw = 0;
  64.             do {
  65.             if (lenstr > tmpw)
  66.                 tmpw = strlen(str);
  67.             ++tmph;
  68.             xfwrite(xfj, str, strlen(str));
  69.             xfwrite(xfj, "\n", 1);
  70.             if (estr && strncmp(str,estr,elen) == 0)
  71.                 break;
  72.             --len;
  73.             } while ((lenstr=xefgets(xfi, str, 256)) >= 0 && len);
  74.             xfclose(xfj);
  75.             if (tmph > 10)
  76.             tmph = 10;
  77.             if (tmpw > 80)
  78.             tmpw = 80;
  79.             sprintf(str, "tmpheight %ld tmpwidth %ld newwindow newfile t:dme_ref", (tmph<<3)+16, (tmpw<<3)+16);
  80.             do_command(str);
  81.             unlink("t:dme_ref");
  82.         } else {
  83.             title("Unable to open t:dme_ref for write");
  84.         }
  85.         xfclose(xfi);
  86.         free(srch);
  87.         free(file);
  88.         if (estr)
  89.             free(estr);
  90.         return;
  91.         }
  92.         if (--bcnt == 0) {      /* check break every so so  */
  93.         bcnt = 50;
  94.         if (breakcheck())
  95.             break;
  96.         }
  97.     }
  98.     xfclose(xfi);
  99.     title("Search failed");
  100.     } else {
  101.     title("Unable to open sub document");
  102.     }
  103.     free(srch);
  104.     free(file);
  105.     if (estr)
  106.     free(estr);
  107. }
  108.  
  109. /*
  110.  *  Reference file format:
  111.  *
  112.  *  `key' `lines' `file' `searchstring'
  113.  *
  114.  *  where `lines' can be a string instead ... like a read-until, otherwise
  115.  *  the number of lines to read from the reference.
  116.  */
  117.  
  118. searchref(file, find, psstr, pfile, plines, pestr)
  119. char *file, *find;
  120. char **psstr, **pfile, **pestr;
  121. long *plines;
  122. {
  123.     long xfi;
  124.     char buf[256];
  125.     char *ptr, *base;
  126.     char *b1, *b2, *b3, *b4;
  127.     char quoted;
  128.  
  129.     mountrequest(0);
  130.     if (xfi = xfopen(file, "r", 4096)) {
  131.     while (xefgets(xfi,(base=buf), 256) >= 0) {
  132.         if (buf[0]=='#')
  133.         continue;
  134.         ptr = breakout(&base, "ed, &b1);
  135.         if (ptr && *ptr && strncmp(ptr, find, strlen(ptr)) == 0) {
  136.         if (ptr = breakout(&base, "ed, &b2)) {
  137.             *pestr = NULL;
  138.             *plines = atoi(ptr);
  139.             if (*plines == 0) {
  140.             *pestr = (char *)malloc(strlen(ptr)+1);
  141.             strcpy(*pestr, ptr);
  142.             }
  143.             if (ptr = breakout(&base, "ed, &b3)) {
  144.             *pfile = (char *)malloc(strlen(ptr)+1);
  145.             strcpy(*pfile, ptr);
  146.             if (ptr = breakout(&base, "ed, &b4)) {
  147.                 *psstr = (char *)malloc(strlen(ptr)+1);
  148.                 strcpy(*psstr, ptr);
  149.                 xfclose(xfi);
  150.                 mountrequest(1);
  151.                 if (b1) free(b1);
  152.                 if (b2) free(b2);
  153.                 if (b3) free(b3);
  154.                 if (b4) free(b4);
  155.                 return(1);
  156.             }
  157.             free(*pfile);
  158.             if (b4)
  159.                 free(b4);
  160.             }
  161.             if (pestr)
  162.             free (*pestr);
  163.             if (b3)
  164.             free (b3);
  165.         }
  166.         if (b2)
  167.             free(b2);
  168.         }
  169.         if (b1)
  170.         free(b1);
  171.     }
  172.     xfclose(xfi);
  173.     }
  174.     mountrequest(1);
  175.     return(0);
  176. }
  177.  
  178.  
  179.