]> code.delx.au - gnu-emacs/commitdiff
* etags.c (Pascal_functions): Close comment bug corrected.
authorFrancesco Potortì <pot@gnu.org>
Thu, 17 Aug 1995 18:39:11 +0000 (18:39 +0000)
committerFrancesco Potortì <pot@gnu.org>
Thu, 17 Aug 1995 18:39:11 +0000 (18:39 +0000)
(add_node): Correctly compare node file names.
(Pascal_functions): Correctly allocate and free memory for tline.
(pfnote): Put the definition of fp in the innermost block.
(NODE): `named' member removed.
(pfnote, free_tree, put_entries, total_size_of_entries): Do not
use the `named' member, check whether `name' is NULL instead.
(pfnote): `named' argument removed, all callers changed.
(getit, Asm_labels, Pascal_functions, L_getit, get_scheme,
TeX_functions, TEX_getit, prolog_getit): Useless string allocation
removed from pfnote call, some code cleanup.
(relative_filename): Free temporary space allocated by concat.

lib-src/etags.c

index 92a07c675bd3a4d1ab9822d79b677b9a5bf35480..1e4875305a73e6fd2671bcfa1eeab3ae8472d11f 100644 (file)
@@ -133,7 +133,6 @@ typedef struct nd_st
   char *name;                  /* function or type name        */
   char *file;                  /* file name                    */
   logical is_func;             /* use pattern or line no       */
-  logical named;               /* list name separately         */
   logical been_warned;         /* set if noticed dup           */
   int lno;                     /* line number tag is on        */
   long cno;                    /* character number line starts on */
@@ -1109,6 +1108,7 @@ find_entries (file, inf)
   NODE *old_last_node;
   extern NODE *last_node;
 
+  /* The memory block pointed by curfile is never released for simplicity. */
   curfile = savestr (file);
   cp = etags_strrchr (file, '.');
 
@@ -1149,33 +1149,27 @@ find_entries (file, inf)
 \f
 /* Record a tag. */
 void
-pfnote (name, is_func, named, linestart, linelen, lno, cno)
-     char *name;               /* tag name */
+pfnote (name, is_func, linestart, linelen, lno, cno)
+     char *name;               /* tag name, if different from definition */
      logical is_func;          /* tag is a function */
-     logical named;            /* tag different from text of definition */
      char *linestart;          /* start of the line where tag is */
      int linelen;              /* length of the line where tag is */
      int lno;                  /* line number */
      long cno;                 /* character number */
 {
   register NODE *np = xnew (1, NODE);
-  register char *fp;
 
   /* If ctags mode, change name "main" to M<thisfilename>. */
   if (CTAGS && !cxref_style && streq (name, "main"))
     {
-      fp = etags_strrchr (curfile, '/');
+      register char *fp = etags_strrchr (curfile, '/');
       np->name = concat ("M", fp == 0 ? curfile : fp + 1, "");
       fp = etags_strrchr (np->name, '.');
       if (fp && fp[1] != '\0' && fp[2] == '\0')
        fp[0] = 0;
-      np->named = TRUE;
     }
   else
-    {
-      np->name = name;
-      np->named = named;
-    }
+    np->name = name;
   np->been_warned = FALSE;
   np->file = curfile;
   np->is_func = is_func;
@@ -1204,7 +1198,7 @@ free_tree (node)
     {
       register NODE *node_right = node->right;
       free_tree (node->left);
-      if (node->named)
+      if (node->name != NULL)
        free (node->name);
       free (node->pat);
       free ((char *) node);
@@ -1255,7 +1249,7 @@ add_node (node, cur_node_p)
        */
       if (!dif)
        {
-         if (node->file == cur_node->file)
+         if (streq (node->file, cur_node->file))
            {
              if (!no_warnings)
                {
@@ -1304,18 +1298,12 @@ put_entries (node)
 
   if (!CTAGS)
     {
-      if (node->named)
-       {
-         fprintf (tagf, "%s\177%s\001%d,%d\n",
-                  node->pat, node->name,
-                  node->lno, node->cno);
-       }
+      if (node->name != NULL)
+       fprintf (tagf, "%s\177%s\001%d,%d\n",
+                node->pat, node->name, node->lno, node->cno);
       else
-       {
-         fprintf (tagf, "%s\177%d,%d\n",
-                  node->pat,
-                  node->lno, node->cno);
-       }
+       fprintf (tagf, "%s\177%d,%d\n",
+                node->pat, node->lno, node->cno);
     }
   else if (!cxref_style)
     {
@@ -1390,7 +1378,7 @@ total_size_of_entries (node)
       /* Count this entry */
       total += strlen (node->pat) + 1;
       total += number_len ((long) node->lno) + 1 + number_len (node->cno) + 1;
-      if (node->named)
+      if (node->name != NULL)
        total += 1 + strlen (node->name);       /* \001name */
     }
 
@@ -1873,8 +1861,12 @@ do {                                                                     \
 #define make_tag(isfun)  do \
 {                                                                      \
   if (tok.valid)                                                       \
-    pfnote (savestr (token_name.buffer), isfun, tok.named,             \
-           tok.buffer, tok.linelen, tok.lineno, tok.linepos);          \
+    {                                                                  \
+      char *name = NULL;                                               \
+      if (tok.named)                                                   \
+       name = savestr (token_name.buffer);                             \
+      pfnote (name, isfun, tok.buffer, tok.linelen, tok.lineno, tok.linepos); \
+    }                                                                  \
   else if (DEBUG) abort ();                                            \
   tok.valid = FALSE;                                                   \
 } while (0)
@@ -2341,10 +2333,9 @@ C_entries (c_ext, inf)
            {
              if (typdef == tinbody)
                typdef = tend;
-#if FALSE                      /* too risky */
-             if (structdef == sinbody)
-               free (structtag);
-#endif
+             if (FALSE)        /* too risky */
+               if (structdef == sinbody)
+                 free (structtag);
 
              structdef = snone;
              structtag = "<error>";
@@ -2426,7 +2417,7 @@ tail (cp)
 
   while (*cp && lowcase(*cp) == lowcase(dbp[len]))
     cp++, len++;
-  if (*cp == 0 && !intoken(dbp[len]))
+  if (*cp == '\0' && !intoken(dbp[len]))
     {
       dbp += len;
       return TRUE;
@@ -2488,8 +2479,7 @@ getit (inf)
        && (isalpha (*cp) || isdigit (*cp) || (*cp == '_') || (*cp == '$')));
        cp++)
     continue;
-  pfnote (savenstr (dbp, cp-dbp), TRUE, FALSE, lb.buffer,
-         cp - lb.buffer + 1, lineno, linecharno);
+  pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
 }
 
 void
@@ -2509,7 +2499,7 @@ Fortran_functions (inf)
        dbp++;                  /* Ratfor escape to fortran */
       while (isspace (*dbp))
        dbp++;
-      if (*dbp == 0)
+      if (*dbp == '\0')
        continue;
       switch (lowcase (*dbp))
        {
@@ -2534,7 +2524,7 @@ Fortran_functions (inf)
            {
              while (isspace (*dbp))
                dbp++;
-             if (*dbp == 0)
+             if (*dbp == '\0')
                continue;
              if (tail ("precision"))
                break;
@@ -2544,7 +2534,7 @@ Fortran_functions (inf)
        }
       while (isspace (*dbp))
        dbp++;
-      if (*dbp == 0)
+      if (*dbp == '\0')
        continue;
       switch (lowcase (*dbp))
        {
@@ -2605,7 +2595,7 @@ Asm_labels (inf)
          if (*cp == ':' || isspace (*cp))
            {
              /* Found end of label, so copy it and add it to the table. */
-             pfnote (savenstr (lb.buffer, cp-lb.buffer), TRUE, FALSE,
+             pfnote (NULL, TRUE,
                      lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
            }
        }
@@ -2634,26 +2624,26 @@ Pascal_functions (inf)
 {
   struct linebuffer tline;     /* mostly copied from C_entries */
   long save_lcno;
-  int save_lineno;
-  char c, *cp;
-  char *nambuf;
+  int save_lineno, save_len;
+  char c;
 
   logical                      /* each of these flags is TRUE iff: */
     incomment,                 /* point is inside a comment */
     inquote,                   /* point is inside '..' string */
-    get_tagname,               /* point is after PROCEDURE/FUNCTION */
-  /*   keyword, so next item = potential tag */
+    get_tagname,               /* point is after PROCEDURE/FUNCTION
+                                  keyword, so next item = potential tag */
     found_tag,                 /* point is after a potential tag */
     inparms,                   /* point is within parameter-list */
-    verify_tag;                        /* point has passed the parm-list, so the */
-  /*   next token will determine whether    */
-  /*   this is a FORWARD/EXTERN to be       */
-  /*   ignored, or whether it is a real tag */
+    verify_tag;                        /* point has passed the parm-list, so the
+                                  next token will determine whether this
+                                  is a FORWARD/EXTERN to be ignored, or
+                                  whether it is a real tag */
 
   lineno = 0;
   charno = 0;
   dbp = lb.buffer;
-  *dbp = 0;
+  *dbp = '\0';
+  save_len = 0;
   initbuffer (&tline);
 
   incomment = inquote = FALSE;
@@ -2673,15 +2663,15 @@ Pascal_functions (inf)
            continue;
          if (!((found_tag && verify_tag) ||
                get_tagname))
-           c = *dbp++;         /* only if don't need *dbp pointing */
-                               /* to the beginning of the name of  */
-                               /* the procedure or function        */
+           c = *dbp++;         /* only if don't need *dbp pointing
+                                  to the beginning of the name of
+                                  the procedure or function */
        }
       if (incomment)
        {
-         if (c == '}')         /* within { } comments */
+         if (c == '}')         /* within { } comments */
            incomment = FALSE;
-         else if (c == '*' && dbp[1] == ')') /* within (* - *) comments */
+         else if (c == '*' && *dbp == ')') /* within (* *) comments */
            {
              dbp++;
              incomment = FALSE;
@@ -2700,11 +2690,11 @@ Pascal_functions (inf)
          case '\'':
            inquote = TRUE;     /* found first quote */
            continue;
-         case '{':             /* found open-{-comment */
+         case '{':             /* found open { comment */
            incomment = TRUE;
            continue;
          case '(':
-           if (*dbp == '*')    /* found open-(*-comment */
+           if (*dbp == '*')    /* found open (* comment */
              {
                incomment = TRUE;
                dbp++;
@@ -2717,19 +2707,19 @@ Pascal_functions (inf)
              inparms = FALSE;
            continue;
          case ';':
-           if ((found_tag) && (!inparms))      /* end of proc or fn stmt */
+           if (found_tag && !inparms) /* end of proc or fn stmt */
              {
                verify_tag = TRUE;
                break;
              }
            continue;
          }
-      if ((found_tag) && (verify_tag) && (*dbp != ' '))
+      if (found_tag && verify_tag && (*dbp != ' '))
        {
          /* check if this is an "extern" declaration */
-         if (*dbp == 0)
+         if (*dbp == '\0')
            continue;
-         if ((*dbp == 'e') || (*dbp == 'E'))
+         if (lowcase (*dbp == 'e'))
            {
              if (tail ("extern"))      /* superfluous, really! */
                {
@@ -2737,7 +2727,7 @@ Pascal_functions (inf)
                  verify_tag = FALSE;
                }
            }
-         else if ((*dbp == 'f') || (*dbp == 'F'))
+         else if (lowcase (*dbp) == 'f')
            {
              if (tail ("forward"))     /*  check for forward reference */
                {
@@ -2745,31 +2735,37 @@ Pascal_functions (inf)
                  verify_tag = FALSE;
                }
            }
-         if ((found_tag) && (verify_tag)) /* not external proc, so make tag */
+         if (found_tag && verify_tag) /* not external proc, so make tag */
            {
              found_tag = FALSE;
              verify_tag = FALSE;
-             pfnote (nambuf, TRUE, FALSE, tline.buffer,
-                     cp - tline.buffer + 1, save_lineno, save_lcno);
+             pfnote (NULL, TRUE,
+                     tline.buffer, save_len, save_lineno, save_lcno);
              continue;
            }
        }
       if (get_tagname)         /* grab name of proc or fn */
        {
-         if (*dbp == 0)
+         int size;
+
+         if (*dbp == '\0')
            continue;
 
          /* save all values for later tagging */
-         tline.size = lb.size;
+         size  = strlen (lb.buffer) + 1;
+         while (size > tline.size)
+           {
+             tline.size *= 2;
+             tline.buffer = (char *) xrealloc (tline.buffer, tline.size);
+           }
          strcpy (tline.buffer, lb.buffer);
          save_lineno = lineno;
          save_lcno = linecharno;
 
          /* grab block name */
-         for (cp = dbp + 1; *cp && (!endtoken (*cp)); cp++)
+         for (dbp++; *dbp && (!endtoken (*dbp)); dbp++)
            continue;
-         nambuf = savenstr (dbp, cp-dbp);
-         dbp = cp;             /* restore dbp to e-o-token */
+         save_len = dbp - lb.buffer + 1;
          get_tagname = FALSE;
          found_tag = TRUE;
          continue;
@@ -2792,6 +2788,8 @@ Pascal_functions (inf)
            }
        }
     }                          /* while not eof */
+  
+  free (tline.buffer);
 }
 \f
 /*
@@ -2839,8 +2837,7 @@ L_getit ()
   if (cp == dbp)
     return;
   
-  pfnote (savenstr (dbp, cp-dbp), TRUE, FALSE, lb.buffer,
-         cp - lb.buffer + 1, lineno, linecharno);
+  pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
 }
 
 void
@@ -2950,15 +2947,14 @@ get_scheme ()
 {
   register char *cp;
 
-  if (*dbp == 0)
+  if (*dbp == '\0')
     return;
   /* Go till you get to white space or a syntactic break */
   for (cp = dbp + 1;
        *cp && *cp != '(' && *cp != ')' && !isspace (*cp);
        cp++)
     continue;
-  pfnote (savenstr (dbp, cp-dbp), TRUE, FALSE,
-         lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+  pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
 }
 \f
 /* Find tags in TeX and LaTeX input files.  */
@@ -2982,8 +2978,10 @@ char *TEX_defenv = "\
 
 void TEX_mode ();
 struct TEX_tabent *TEX_decode_env ();
-void TEX_getit ();
 int TEX_Token ();
+#if TeX_named_tokens
+void TEX_getit ();
+#endif
 
 char TEX_esc = '\\';
 char TEX_opgrp = '{';
@@ -3026,7 +3024,11 @@ TeX_functions (inf)
          i = TEX_Token (lasthit);
          if (0 <= i)
            {
+             pfnote (NULL, TRUE,
+                     lb.buffer, strlen (lb.buffer), lineno, linecharno);
+#if TeX_named_tokens
              TEX_getit (lasthit, TEX_toktab[i].len);
+#endif
              break;            /* We only save a line once */
            }
        }
@@ -3121,6 +3123,7 @@ TEX_decode_env (evarname, defenv)
   return tab;
 }
 
+#if TeX_named_tokens
 /* Record a tag defined by a TeX command of length LEN and starting at NAME.
    The name being defined actually starts at (NAME + LEN + 1).
    But we seem to include the TeX command in the tag name.  */
@@ -3131,15 +3134,16 @@ TEX_getit (name, len)
 {
   char *p = name + len;
 
-  if (*name == 0)
+  if (*name == '\0')
     return;
 
   /* Let tag name extend to next group close (or end of line) */
   while (*p && *p != TEX_clgrp)
     p++;
-  pfnote (savenstr (name, p-name), TRUE, FALSE, lb.buffer,
-         strlen (lb.buffer), lineno, linecharno);
+  pfnote (savenstr (name, p-name), TRUE,
+         lb.buffer, strlen (lb.buffer), lineno, linecharno);
 }
+#endif
 
 /* If the text at CP matches one of the tag-defining TeX command names,
    return the pointer to the first occurrence of that command in TEX_toktab.
@@ -3208,8 +3212,7 @@ prolog_getit (s)
       else
        s++;
     }
-  pfnote (savenstr (save_s, s-save_s), TRUE, FALSE,
-         save_s, s-save_s, lineno, linecharno);
+  pfnote (NULL, TRUE, save_s, s-save_s, lineno, linecharno);
 }
 
 /* It is assumed that prolog predicate starts from column 0. */
@@ -3538,14 +3541,14 @@ readline (linebuffer, stream)
                                       patterns[i].name_pattern,
                                       &patterns[i].regs);
              if (name != NULL)
-               pfnote (name, TRUE, TRUE, linebuffer->buffer,
-                       match, lineno, linecharno);
+               pfnote (name, TRUE,
+                       linebuffer->buffer, match, lineno, linecharno);
            }
          else
            {
              /* Make an unnamed tag. */
-             pfnote (NULL, TRUE, FALSE, linebuffer->buffer,
-                     match, lineno, linecharno);
+             pfnote (NULL, TRUE,
+                     linebuffer->buffer, match, lineno, linecharno);
            }
          break;
        }
@@ -3737,10 +3740,11 @@ char *
 relative_filename (file, dir)
      char *file, *dir;
 {
-  char *fp, *dp, *res;
+  char *fp, *dp, *abs, *res;
 
   /* Find the common root of file and dir. */
-  fp = absolute_filename (file, cwd);
+  abs = absolute_filename (file, cwd);
+  fp = abs;
   dp = dir;
   while (*fp++ == *dp++)
     continue;
@@ -3761,8 +3765,9 @@ relative_filename (file, dir)
 
   /* Add the filename relative to the common root of file and dir. */
   res = concat (res, fp + 1, "");
+  free (abs);
 
-  return res;                  /* temporary stub */
+  return res;
 }
 
 /* Return a newly allocated string containing the
@@ -3856,7 +3861,7 @@ xrealloc (ptr, size)
      char *ptr;
      unsigned int size;
 {
-  long *result = (long *) realloc (ptr, size);
+  long *result =  (long *) realloc (ptr, size);
   if (result == NULL)
     fatal ("virtual memory exhausted");
   return result;