|
|
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.