ack/util/led/save.c
George Koehler f09f14cd4d Switch from long to size_t when allocating memory.
Also move the declarations of `incore` and `core_alloc` to "memory.h".
Also correct SYMDEBUG to SYMDBUG.  (I don't know if SYMDBUG works
because our build system never defines it.)

ind_t becomes an alias of size_t.  ind_t becomes unsigned, so I edit
some code that was using negative ind_t.  Some casts disappear, like
(long)sizeof(...) because the size is already a size_t.  There are
changes to overflow checks.  Callers with a size too big for size_t
must check it before calling the memory allocator.  An overflow check
of BASE + incr in memory.c sbreak() now happens on all platforms, not
only when a pointer is smaller than a long.

My build shows no changes in share/ack/examples (except hilo_bas.*
changing with every build).
2018-11-14 12:33:25 -05:00

110 lines
2.3 KiB
C

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
#ifndef lint
static char rcsid[] = "$Id$";
#endif
/*
* If everything is kept in core, we must save some things for the second pass.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "arch.h"
#include "out.h"
#include "const.h"
#include "memory.h"
void
savemagic()
{
register char *p;
if (!incore)
return;
if ((p = core_alloc(ALLOMODL, sizeof(int))) != (char *)0) {
*(unsigned short *)p = AALMAG;
core_position += sizeof(int);
}
}
void
savehdr(hdr)
struct ar_hdr *hdr;
{
register char *p;
if (!incore)
return;
if ((p=core_alloc(ALLOMODL, sizeof(struct ar_hdr)))!=(char *)0) {
*(struct ar_hdr *)p = *hdr;
core_position += int_align(sizeof(struct ar_hdr));
}
}
long NLChars = 0; /* Size of string area for local names. */
long NGChars = 0; /* Idem for global names. */
/*
* Put the string in cp into the block allocated for the string area.
* Return its offset in this area. We don't use the first char of the string
* area, so that empty strings can be distinguished from the first string.
*/
ind_t
savechar(piece, off)
register int piece;
register ind_t off;
{
register size_t len;
register ind_t newoff;
if (off == (ind_t)0)
return 0;
len = strlen(modulptr(off)) + 1;
if (piece == ALLOLCHR) {
NLChars += len;
if (!incore || (newoff = alloc(piece, len)) == BADOFF)
return BADOFF;
} else {
assert(piece == ALLOGCHR);
NGChars += len;
if ((newoff = hard_alloc(piece, len)) == BADOFF)
return BADOFF;
}
strcpy(address(piece, newoff), modulptr(off));
return newoff;
}
/*
* Put the local in `name' in the piece allocated for local names that must
* be saved. `Name' points to a private copy, so will not become invalid after
* allocation, but the string of which name->on_foff is the offset may be
* destroyed, so we save that first.
*/
void
savelocal(name)
struct outname *name;
{
ind_t savindex;
struct outname *new;
if ((savindex = savechar(ALLOLCHR, (ind_t)name->on_foff)) == BADOFF)
return;
new = (struct outname *)
core_alloc(ALLOLOCL, sizeof(struct outname));
if (new != (struct outname *)0) {
*new = *name;
new->on_foff = savindex;
}
}