Annotation of researchv9/jerq/sgs/libld/ldlread.c, revision 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.