Diff for /freem/src/routine.c between versions 1.5 and 1.10

version 1.5, 2025/04/09 19:52:02 version 1.10, 2025/05/01 03:56:29
Line 24 Line 24
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.   *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *   *
  *   $Log$   *   $Log$
    *   Revision 1.10  2025/05/01 03:56:29  snw
    *   -m
    *
    *   Revision 1.9  2025/04/30 20:03:09  snw
    *   Work on entryref parser
    *
    *   Revision 1.8  2025/04/30 17:19:16  snw
    *   Improve backtraces in debugger
    *
    *   Revision 1.7  2025/04/30 14:41:03  snw
    *   Further debugger work
    *
    *   Revision 1.6  2025/04/13 04:22:43  snw
    *   Fix snprintf calls
    *
  *   Revision 1.5  2025/04/09 19:52:02  snw   *   Revision 1.5  2025/04/09 19:52:02  snw
  *   Eliminate as many warnings as possible while building with -Wall   *   Eliminate as many warnings as possible while building with -Wall
  *   *
Line 259  short rtn_get_path(char *rou, char *buf) Line 274  short rtn_get_path(char *rou, char *buf)
         stcnv_m2c (pth);          stcnv_m2c (pth);
     }      }
           
     snprintf (buf, PATHLEN, "%s/%s.m", pth, rou);      snprintf (buf, PATHLEN - 1, "%s/%s.m", pth, rou);
           
     if ((fp = fopen (buf, "r")) != NULL) {      if ((fp = fopen (buf, "r")) != NULL) {
         (void) fclose (fp);          (void) fclose (fp);
Line 1141  void lineref (char **adrr) Line 1156  void lineref (char **adrr)
           
     return;      return;
 }                                       /* end of lineref() */  }                                       /* end of lineref() */
   
   char *m_text(char *lref, char *buf)
   {
       char *old_codptr;
       char old_code[STRLEN];
       
       old_codptr = codptr;
       stcpy (old_code, code);
       
       sprintf (code, "$TEXT(%s)\201", lref);
       codptr = code;
       
       expr (STRING);
   
       if (merr () != OK) {
           stcpy (code, old_code);
           codptr = old_codptr;
           return (char *) NULL;
       }
   
       stcpy (buf, argptr);
       stcpy (code, old_code);
       codptr = old_codptr;
   
       return buf;
   }
       
   
   
   /* routine_get_line()
    *  char *entryref:  [cstr/in] M entryref
    *  char *buf:   [cstr/out] buffer to contain resulting line
    *
    *  returns a pointer to buf [cstr] on success; otherwise NULL */
   char *routine_get_line(char *entryref, char *buf)
   {
       FILE *fp;
       char routine_path[PATHLEN];
       
       char *routine_p;
       char *label_p;
       char *offset_p;
   
       short have_label = FALSE;
       short have_offset = FALSE;
       
       char r[256];
       char l[256];
       char o[256];
       char txtbuf[256];
       char line[2048];
       int curline;
       char curtag[256];
       int cur_offset;
       int os;
   
       register int i;
       register int j;
       char ch;
   
       short in_tag = FALSE;
       
       /*
        * entryref can be:
        *  +0 (returns rou_name)
        *  label
        *  ^routine
        *  +offset
        *  +offset^routine
        *  label^routine
        *  label+offset^routine
        */
   
       /* handle +0 */
       if (strcmp (entryref, "+0") == 0) {
           stcpy (buf, rou_name);
           stcnv_m2c (buf);
           return buf;
       }
   
       if ((routine_p = strchr (entryref, '^')) != NULL) {
           /* have a routine */
           stcpy (r, routine_p);
           stcnv_m2c (r);
           
           if ((entryref[0] != '^') && (isalpha (entryref[0]))) {
               /* we have a label */
               char ch;
               char *src;
               char *dst;
               
               src = entryref;
               dst = l;
   
               while (((ch = *src++) != '\0') && (ch != '^') && (ch != '+')) {
                   *dst++ = ch;
               }
               *dst = '\0';
               have_label = TRUE;
           }
       }
       else {
           /* no routine implies current routine */
           stcpy (r, rou_name);
           stcnv_m2c (r);
       }
   
       if (r[0] == '^') {
           strcpy (txtbuf, &(r[1]));
           strcpy (r, txtbuf);
       }
       
       if (rtn_get_path (r, routine_path) == FALSE) {
           sprintf (buf, "");
           return NULL;
       }
   
       if ((fp = fopen (routine_path, "r")) == NULL) {
           sprintf (buf, "");
           return NULL;
       }
           
       if ((offset_p = strchr (entryref, '+')) != NULL) {
           stcpy (o, offset_p + 1);
           os = atoi (o);
           sprintf (o, "%d\0", os);
           have_offset = TRUE;
       }
       else {
           have_offset = FALSE;
           os = 1;
       }
   
       in_tag = FALSE;
       cur_offset = 0;
       while (fgets (line, sizeof (line) - 1, fp) != NULL) {       
   
           if (!have_label && !have_offset) {
               strcpy (buf, line);
               fclose (fp);
               return buf;
           }
           
           if (isalpha (line[0]) && !isblank (line[0])) {
               j = 0;
   
               for (i = 0; i < strlen (line); i++) {
                   ch = line[i];
   
                   if ((!isalpha (ch)) && (!isdigit (ch))) {
                       curtag[j] = '\0';
                       cur_offset = 0;
                       if (have_label && (strcmp (curtag, l) == 0)) {
                           in_tag = TRUE;                        
                           if (!have_offset) {
                               strcpy (buf, line);
                               fclose (fp);
                               return buf;
                           }
                       }
                       else {
                           in_tag = FALSE;
                       }
                       break;
                   }
                   else {
                       curtag[j++] = ch;
                   }
               }            
           }
           else {
               cur_offset++;
   
               if (in_tag && (cur_offset == os)) {
                   strcpy (buf, line);
                   fclose (fp);
                   return buf;
               }
           }        
           
       }
   
       fclose (fp);
       return FALSE;
   
   }
   

Removed from v.1.5  
changed lines
  Added in v.1.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>