|
|
1.1 ! root 1: /* ! 2: * Take ast - generated list files, take a.sym, produce a ! 3: * list file with updated PC's. ! 4: */ ! 5: #include <stdio.h> ! 6: #define TRUE 1 ! 7: #define FALSE 0 ! 8: #define NSYM 4000 ! 9: ! 10: struct symbol { ! 11: char name[13]; ! 12: long value; ! 13: } symbol[NSYM]; ! 14: ! 15: long basevalue, knownstart; ! 16: char lastsymbol[13]; ! 17: char line[200]; ! 18: FILE *asym, *source = stdin; ! 19: char *symfil = "a.sym"; ! 20: ! 21: main(argc, argv) ! 22: int argc; ! 23: char *argv[]; ! 24: { ! 25: long eof, i; ! 26: ! 27: knownstart = FALSE; ! 28: if (argc > 3) { ! 29: printf("Usage : %s [listfile] [symbolsfile]\n", argv[0]); ! 30: exit(1); ! 31: } ! 32: if (argc >= 2) { ! 33: source = fopen(argv[1], "r"); ! 34: if (source == NULL) { ! 35: printf("Cannot open %s\n", argv[1]); ! 36: exit(1); ! 37: } ! 38: } ! 39: if (argc == 3) ! 40: symfil = argv[2]; ! 41: asym = fopen (symfil, "r"); ! 42: if (asym == NULL) { ! 43: printf("Cannot open %s\n", symfil); ! 44: exit(1); ! 45: } ! 46: eof = FALSE; ! 47: for (i=0; i < NSYM && !eof; i++) { ! 48: if (fgets(line, 80, asym)==NULL) eof = TRUE; ! 49: sscanf(line, "%s %x", symbol[i].name, &symbol[i].value); ! 50: } ! 51: ! 52: eof = FALSE; /* source file now */ ! 53: while (!eof) { ! 54: if (fgets(line,200, source)==NULL) eof =TRUE; ! 55: if (!knownstart) checkline(); ! 56: if (knownstart) transform(); ! 57: printf("%s", line); ! 58: } ! 59: } ! 60: ! 61: /* ! 62: * Check line for symbols and for start of text. ! 63: */ ! 64: checkline() ! 65: { ! 66: long i, j, place; ! 67: ! 68: i = place = 0; ! 69: while (line[i] != '_' && line[i] != '\0' && line[i] != '\n') i++; ! 70: if (line[i] == '_' && (i==0 || ! 71: line[i-1] == ' ' || line[i-1] == '\t')) { ! 72: for (j=0; j<13; j++) lastsymbol[j] = '\0'; ! 73: while (line[i] != ':' && line[i] != '\0' ! 74: && line[i] != '\n' && place<13 ) ! 75: lastsymbol[place++] = line[i++]; ! 76: } ! 77: if (!place) ! 78: if (line[3] == ' ' || line[15] == '*' || line[18] == ' ') return; ! 79: /* ! 80: * Found start of text ! 81: */ ! 82: for (i=0; i< NSYM && !knownstart; i++) { ! 83: if (strncmp(symbol[i].name, lastsymbol, place)==0) { ! 84: knownstart = TRUE; ! 85: sscanf(&line[6] , "%x", &j); ! 86: basevalue = symbol[i].value - j; ! 87: } ! 88: } ! 89: if (!knownstart) printf("Symbol %s not found ---\n", lastsymbol); ! 90: } ! 91: ! 92: /* ! 93: * Transform text lines ! 94: */ ! 95: transform() ! 96: { ! 97: ! 98: long i; ! 99: ! 100: if (line[3] == ' ' || line[15] == '*') return; ! 101: sscanf(&line[6] , "%x", &i); ! 102: i += basevalue; ! 103: sprintf(&line[6], "%08x", i); line[14] = ' '; ! 104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.