|
|
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, §head) == 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";
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.