gbdk-releases/sdcc/as/mcs51/lkhead.c
2015-01-10 16:25:09 +01:00

154 lines
3.2 KiB
C

/* lkhead.c */
/*
* (C) Copyright 1989-1995
* All Rights Reserved
*
* Alan R. Baldwin
* 721 Berkeley St.
* Kent, Ohio 44240
*/
#include <stdio.h>
#include <string.h>
#include "aslink.h"
/*Module lkhead.c
*
* The module lkhead.c contains the function newhead() which
* creates a head structure and the function module() which
* loads the module name into the current head structure.
*
* lkhead.c contains the following functions:
* VOID newhead()
* VOID module()
*
* lkhead.c contains no local variables.
*/
/*)Function VOID newhead()
*
* The function newhead() creates a head structure. All head
* structures are linked to form a linked list of head structures
* with the current head structure at the tail of the list.
*
* local variables:
* int i evaluation value
* head * thp temporary pointer
* to a header structure
*
* global variables:
* area *ap Pointer to the current
* area structure
* lfile *cfp The pointer *cfp points to the
* current lfile structure
* head *headp The pointer to the first
* head structure of a linked list
* head *hp Pointer to the current
* head structure
*
* functions called:
* Addr_T expr() lkeval.c
* VOID * new() lksym.c
* VOID lkparea() lkarea.c
*
* side effects:
* A new head structure is created and linked to any
* existing linked head structure. The head structure
* parameters of file handle, number of areas, and number
* of global symbols are loaded into the structure.
* The default area "_abs_" is created when the first
* head structure is created and an areax structure is
* created for every head structure called.
*/
/*
* Create a new header entry.
*
* H n areas n global symbols
* | |
* | `---- hp->h_nglob
* `------------ hp->h_narea
*
*/
VOID
newhead()
{
register int i;
struct head *thp;
hp = (struct head *) new (sizeof(struct head));
if (headp == NULL) {
headp = hp;
} else {
thp = headp;
while (thp->h_hp)
thp = thp->h_hp;
thp->h_hp = hp;
}
/*
* Set file pointer
*/
hp->h_lfile = cfp;
/*
* Evaluate and build Area pointer list
*/
i = hp->h_narea = eval();
if (i)
hp->a_list = (struct areax **) new (i*sizeof(struct areax *));
/*
* Evaluate and build Global symbol pointer list
*/
skip(-1);
i = hp->h_nglob = eval();
if (i)
hp->s_list = (struct sym **) new (i*sizeof(struct sym *));
/*
* Setup Absolute DEF linkage.
*/
lkparea(_abs_);
ap->a_flag = A_ABS|A_OVR;
}
/*)Function VOID module()
*
* The function module() copies the module name into
* the current head structure.
*
* local variables:
* char id[] module id string
*
* global variables:
* head *headp The pointer to the first
* head structure of a linked list
* head *hp Pointer to the current
* head structure
* int lkerr error flag
* FILE * stderr c_library
*
* functions called:
* int fprintf() c_library
* VOID getid() lklex.c
* char * strncpy() c_library
*
* side effects:
* The module name is copied into the head structure.
*/
/*
* Module Name
*/
VOID
module()
{
char id[NCPS];
if (headp) {
getid(id, -1);
strncpy(hp->m_id, id, NCPS);
} else {
fprintf(stderr, "No header defined\n");
lkerr++;
}
}