V10/cmd/adb/cray/hksyminit.c
/*
* set up the symbol table
* very cheap hack version for cray:
* read the loader map
*/
#include "defs.h"
#include "sym.h"
#include <stdio.h>
#include "machine.h"
#define NMFMT "%s %lo%c" /* name value (junk) */
#define NSYMS 20
static lcopy();
/*
* `fn' is the name of the a.out file.
* if it was a valid a.out, look for a map in `fn'.map
* else see if fn itself is a map
*/
hksyminit(fn, isexec)
char *fn;
int isexec;
{
FILE *fp;
register struct sym *p;
struct sym *syms;
char buf[ARB];
long val;
char flag;
char name[ARB];
int inmap = 0;
char *malloc();
symtab = NULL;
strcpy(name, fn);
if (isexec)
strcat(name, ".map");
if ((fp = fopen(name, "r")) == NULL)
return;
if (fgets(buf, ARB, fp) == NULL
|| (buf[0] != '1' || buf[2] != ' ')) {
fclose(fp);
return; /* probably not a loader map */
}
syms = NULL;
while (fgets(buf, ARB, fp)) {
if (inmap == 0) {
if (maphdr(buf) == 0)
continue;
inmap++;
}
if (sscanf(buf, NMFMT, name, &val, &flag) != 3)
continue;
if (!isalpha(name[0]))
continue;
if (syms == NULL || p >= syms + NSYMS) {
if ((syms = (struct sym *)malloc(NSYMS * sizeof(struct sym))) == NULL) {
printf("out of mem for syms");
break;
}
p = syms;
}
if ((p->y_name = malloc(strlen(name) + 1)) == NULL) {
printf("out of mem for syms");
break;
}
lcopy(p->y_name, name);
p->y_value = watoba(val);
if (flag == ' ')
p->y_type = S_DATA;
else
p->y_type = S_TEXT; /* parcel addr */
p->y_next = symtab;
symtab = p;
p++;
}
fclose(fp);
}
/*
* look for the beginning of the interesting part
* this is just to cut down on specious syms
*/
maphdr(s)
register char *s;
{
while (*s == ' ')
s++;
return (strncmp(s, "ENTRY POINT CROSS-", 18) == 0);
}
static
lcopy(s, t)
register char *s, *t;
{
while (*t) {
if (*t == '$') {
*s++ = '_';
t++;
}
else
*s++ = *t++;
}
*s = 0;
}
/*
* compare sym entry name with one the user typed
*/
eqsym(sp, n)
struct sym *sp;
char *n;
{
return (strncmp(sp->y_name, n, 8) == 0);
}