Annotation of researchv9/jerq/sgs/libld/ldlread.c, revision 1.1.1.1

1.1       root        1: #include       <stdio.h>
                      2: #include       "filehdr.h"
                      3: #include       "scnhdr.h"
                      4: #include       "linenum.h"
                      5: #include       "syms.h"
                      6: #include       "ldfcn.h"
                      7: 
                      8: static long            lnnoptr = 0L;
                      9: static unsigned short  maxlnnos = 0;
                     10: static LDFILE          *saveldptr = NULL;
                     11: 
                     12: 
                     13: int
                     14: ldlread(ldptr, fcnindx, linenum, linent)
                     15: 
                     16: LDFILE         *ldptr;
                     17: long           fcnindx;
                     18: unsigned short linenum;
                     19: LINENO         *linent;
                     20: 
                     21: {
                     22:     extern int ldlinit( );
                     23:     extern int ldlitem( );
                     24: 
                     25: 
                     26:     if (ldlinit(ldptr, fcnindx) == SUCCESS) {
                     27:        return(ldlitem(ldptr, linenum, linent));
                     28:     }
                     29: 
                     30:     return(FAILURE);
                     31: 
                     32: }
                     33: 
                     34: 
                     35: 
                     36: 
                     37: int
                     38: ldlinit(ldptr, fcnindx)
                     39: 
                     40: LDFILE         *ldptr;
                     41: long           fcnindx;
                     42: 
                     43: {
                     44:     extern int         fread( );
                     45:     extern int         fseek( );
                     46: 
                     47:     extern int         ldtbread( );
                     48:     extern int         ldshread( );
                     49: 
                     50:     SCNHDR             secthead;
                     51:     SYMENT             symbol;
                     52:     AUXENT             aux;
                     53:     LINENO             line;
                     54: 
                     55:     long               endlnptr;
                     56: 
                     57: 
                     58:     saveldptr = ldptr;
                     59: 
                     60:     if (ldtbread(ldptr, fcnindx, &symbol) == SUCCESS) {
                     61:       if (ISFCN(symbol.n_type) && (symbol.n_numaux == 1)) {
                     62:        if (FREAD(&aux, AUXESZ, 1, ldptr) == 1) {
                     63: 
                     64:          if (ldshread(ldptr, symbol.n_scnum, &secthead) == SUCCESS) {
                     65: 
                     66:            if ((lnnoptr = aux.x_sym.x_fcnary.x_fcn.x_lnnoptr) != 0L) {
                     67: 
                     68:              endlnptr = secthead.s_lnnoptr + (long) (secthead.s_nlnno * LINESZ);
                     69:              if ((secthead.s_lnnoptr<=lnnoptr)&&(lnnoptr + LINESZ<=endlnptr)) {
                     70: 
                     71:                /* lnnoptr should be greater or equal to s_lnnoptr
                     72:                 * and less than endlnnoptr by at least as much as LINESZ
                     73:                 */
                     74: 
                     75:                maxlnnos = (unsigned short) (((endlnptr - lnnoptr)/LINESZ) - 1);
                     76: 
                     77:                if (FSEEK(ldptr, lnnoptr, BEGINNING) == OKFSEEK) {
                     78:                  if (FREAD(&line, LINESZ, 1, ldptr) == 1) {
                     79:                    if ((line.l_lnno == 0)&&(line.l_addr.l_symndx == fcnindx)) {
                     80:                      return(SUCCESS);
                     81:                    }
                     82:                  }
                     83:                }
                     84:              }
                     85:            } else {
                     86:              if (FSEEK(ldptr, secthead.s_lnnoptr, BEGINNING) == OKFSEEK) {
                     87: 
                     88:                for (maxlnnos = secthead.s_nlnno; maxlnnos != 0; --maxlnnos) {
                     89:                  if (FREAD(&line, LINESZ, 1, ldptr) != 1) {
                     90:                    lnnoptr = 0L;
                     91:                    maxlnnos = 0;
                     92:                    saveldptr = NULL;
                     93:                    return(FAILURE);
                     94:                  }
                     95: 
                     96:                  if ((line.l_lnno == 0) && (line.l_addr.l_symndx == fcnindx)) {
                     97:                    lnnoptr = secthead.s_lnnoptr + (long) ((secthead.s_nlnno -
                     98:                              maxlnnos) * LINESZ);
                     99:                    --maxlnnos;
                    100:                    return(SUCCESS);
                    101:                  }
                    102:                }
                    103:              }
                    104:            }
                    105:          }
                    106:        }
                    107:       }
                    108:     }
                    109: 
                    110:     lnnoptr = 0L;
                    111:     maxlnnos = 0;
                    112:     saveldptr = NULL;
                    113:     return(FAILURE);
                    114: 
                    115: }
                    116: 
                    117: 
                    118: 
                    119: 
                    120: int
                    121: ldlitem(ldptr, linenum, linent)
                    122: 
                    123: LDFILE         *ldptr;
                    124: unsigned short linenum;
                    125: LINENO         *linent;
                    126: 
                    127: {
                    128:     extern int         fread( );
                    129:     extern int         fseek( );
                    130: 
                    131:     LINENO             line;
                    132:     int                        lflag;
                    133:     unsigned short     i;
                    134: 
                    135: 
                    136:   lflag = FAILURE;
                    137: 
                    138:   if ((ldptr == saveldptr) && (lnnoptr != 0)) {
                    139: 
                    140:     if (FSEEK(ldptr, lnnoptr, BEGINNING) == OKFSEEK) {
                    141: 
                    142:       if (FREAD(&line, LINESZ, 1, ldptr) == 1) {
                    143:        if (line.l_lnno == linenum) {
                    144:          linent->l_lnno = line.l_lnno;
                    145:          linent->l_addr.l_paddr = line.l_addr.l_paddr;
                    146:          return(SUCCESS);
                    147:        }
                    148: 
                    149:        for (i = maxlnnos; i != 0; --i) {
                    150:          if (FREAD(&line, LINESZ, 1, ldptr) != 1) {
                    151:            return(FAILURE);
                    152:          }
                    153:          if (line.l_lnno == 0) {
                    154:            return(lflag);
                    155:          } else if (line.l_lnno == linenum) {
                    156:            linent->l_lnno = line.l_lnno;
                    157:            linent->l_addr.l_paddr = line.l_addr.l_paddr;
                    158:            return(SUCCESS);
                    159:          } else if (line.l_lnno > linenum) {
                    160:            if ((lflag == FAILURE) || (linent->l_lnno > line.l_lnno)) {
                    161:              lflag = SUCCESS;
                    162:              linent->l_lnno = line.l_lnno;
                    163:              linent->l_addr.l_paddr = line.l_addr.l_paddr;
                    164:            }
                    165:          }
                    166:        }
                    167:       }
                    168:     }
                    169:   }
                    170: 
                    171:   return(lflag);
                    172: }
                    173: 
                    174: static char    ID[ ] = "@(#) ldlread.c: 1.1 1/7/82";

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.