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

version 1.9, 2025/04/30 20:03:09 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   *   Revision 1.9  2025/04/30 20:03:09  snw
  *   Work on entryref parser   *   Work on entryref parser
  *   *
Line 1189  char *m_text(char *lref, char *buf) Line 1192  char *m_text(char *lref, char *buf)
  *  returns a pointer to buf [cstr] on success; otherwise NULL */   *  returns a pointer to buf [cstr] on success; otherwise NULL */
 char *routine_get_line(char *entryref, char *buf)  char *routine_get_line(char *entryref, char *buf)
 {  {
     char tmp[STRLEN];      FILE *fp;
     char a[STRLEN];      char routine_path[PATHLEN];
     long l1, rouoldc;      
     short reload = FALSE;  
     char f;  
   
     register int i;  
     register int j;  
   
     char *routine_p;      char *routine_p;
     char *label_p;      char *label_p;
     char *offset_p;      char *offset_p;
Line 1208  char *routine_get_line(char *entryref, c Line 1205  char *routine_get_line(char *entryref, c
     char r[256];      char r[256];
     char l[256];      char l[256];
     char o[256];      char o[256];
       char txtbuf[256];
       char line[2048];
       int curline;
       char curtag[256];
       int cur_offset;
     int os;      int os;
   
       register int i;
       register int j;
       char ch;
   
       short in_tag = FALSE;
           
     /*      /*
      * entryref can be:       * entryref can be:
Line 1231  char *routine_get_line(char *entryref, c Line 1239  char *routine_get_line(char *entryref, c
     if ((routine_p = strchr (entryref, '^')) != NULL) {      if ((routine_p = strchr (entryref, '^')) != NULL) {
         /* have a routine */          /* have a routine */
         stcpy (r, routine_p);          stcpy (r, routine_p);
         printf ("routine = %s\r\n", r);          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 {      else {
         /* no routine implies current routine */          /* no routine implies current routine */
         stcpy (r, rou_name);                  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) {      if ((offset_p = strchr (entryref, '+')) != NULL) {
         stcpy (o, offset_p + 1);          stcpy (o, offset_p + 1);
         os = atoi (o);          os = atoi (o);
         sprintf (o, "%d\201\0", os);          sprintf (o, "%d\0", os);
         printf ("offset = %s\r\n", o);  
         have_offset = TRUE;          have_offset = TRUE;
     }      }
     else {      else {
         have_offset = FALSE;          have_offset = FALSE;
           os = 1;
     }      }
   
     return NULL;      in_tag = FALSE;
     i = 0;      cur_offset = 0;
                               while (fgets (line, sizeof (line) - 1, fp) != NULL) {       
     if (f > 1) {  
         stcpy (tmp, entryref);  
         i = intexpr (tmp);  
     }  
       
     if (i < 0) return (char *) NULL;      
       
     /* $T(+0) returns routine name */  
     if (i == 0) {  
         stcpy (buf, rou_name);  
     }  
   
     if (f == 3) {  
   
         reload = TRUE;  /* load routine; */  
         f = mcmnd;  
         mcmnd = 'd';    /* make load use standard-path */  
                               
         stcpy (tmp, argstck[arg + 2]);  
                               
         rouoldc = roucur - rouptr;  
                               
         zload (tmp);  
                               
         mcmnd = f;  
                               
         if (merr () > OK) {  
   
             zload (rou_name);  
                                   
             if (merr () == NOPGM) {  
                 ierr -= NOPGM; /* smw 15 nov 2023 TODO HUH?? */  
                 *a = EOL;  
   
                 /*goto nxt_operator;*/  
             }  
   
             return 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];
     j = 0;  
     f = 1;  
                           
     if (a[0] != EOL) {  /* 1st arg == label */  
   
         for (;;) {  
                           
             if (j >= (rouend - rouptr)) {  
                 a[0] = EOL;  
                 goto t_end;  
             }  
   
             l1 = j;  
             f = 0;  
                                   
             while (*(rouptr + (++l1)) == a[f++]);  
                                   
             if (a[--f] == EOL && (*(rouptr + l1) == TAB || *(rouptr + l1) == SP || *(rouptr + l1) == '(')) break;  
   
             j += (UNSIGN (*(rouptr + j)) + 2);  /* skip line */  
   
         }  
   
         f = 0;  
   
     }  
   
     if (i > 0) {  
   
         while (f < i) {  
   
             if ((j = j + (UNSIGN (*(rouptr + j))) + 2) >= (rouend - rouptr)) {  
                 a[0] = EOL;  
                 goto t_end;  
             }  
                                   
             f++;  
   
                   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);
     if (i < 0) {                  fclose (fp);
                   return buf;
         j--;  
                               
         while (f != i) {  
   
             while (*(rouptr + (--j)) != EOL && j >= 0);  
                                   
             if (--f != i && j < 1) {  
                 a[0] = EOL;  
                 goto t_end;  
             }              }
           }        
         }          
   
         j++;  
   
     }  
   
     f = (-1);  
     j++;  
   
     while ((a[++f] = (*(rouptr + (j++)))) != EOL) {  
         if (a[f] == TAB || a[f] == SP)  
             break;  
     }  
   
     if (j >= (rouend - rouptr - 1)) {  
         a[0] = EOL;  
     }   
     else {  
   
         a[f] = SP;  
                               
         while ((*(rouptr + j)) == TAB || (*(rouptr + j)) == SP) {  
             j++;  
             a[++f] = SP;  
         }  
   
         stcpy (&a[++f], rouptr + j);  
   
     }      }
   
 t_end:      fclose (fp);
     if (reload) {      return FALSE;
         zload (rou_name);  
         roucur = rouptr + rouoldc;  
     }           /* reload routine; */  
   
   
 }  }
   

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


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