diff options
author | Ulrich Drepper <drepper@redhat.com> | 2005-07-26 05:00:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2005-07-26 05:00:05 +0000 |
commit | b08d5a8fb42f4586d756068065186b5af7e48dad (patch) | |
tree | 9f05f86be7877ed461b4dc05f53b29ea4fc0d2a1 /libasm/asm_newsubscn.c | |
download | elfutils-b08d5a8fb42f4586d756068065186b5af7e48dad.tar.gz |
Adjust for monotone.
Diffstat (limited to 'libasm/asm_newsubscn.c')
-rw-r--r-- | libasm/asm_newsubscn.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/libasm/asm_newsubscn.c b/libasm/asm_newsubscn.c new file mode 100644 index 00000000..e767720e --- /dev/null +++ b/libasm/asm_newsubscn.c @@ -0,0 +1,84 @@ +/* Create new subsection section in given section. + Copyright (C) 2002 Red Hat, Inc. + Written by Ulrich Drepper <drepper@redhat.com>, 2002. + + This program is Open Source software; you can redistribute it and/or + modify it under the terms of the Open Software License version 1.0 as + published by the Open Source Initiative. + + You should have received a copy of the Open Software License along + with this program; if not, you may obtain a copy of the Open Software + License version 1.0 from http://www.opensource.org/licenses/osl.php or + by writing the Open Source Initiative c/o Lawrence Rosen, Esq., + 3001 King Ranch Road, Ukiah, CA 95482. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> + +#include <libasmP.h> +#include <system.h> + + +AsmScn_t * +asm_newsubscn (asmscn, nr) + AsmScn_t *asmscn; + unsigned int nr; +{ + AsmScn_t *runp; + AsmScn_t *newp; + + /* Just return if no section is given. The error must have been + somewhere else. */ + if (asmscn == NULL) + return NULL; + + /* Determine whether there is already a subsection with this number. */ + runp = asmscn->subsection_id == 0 ? asmscn : asmscn->data.up; + while (1) + { + if (runp->subsection_id == nr) + /* Found it. */ + return runp; + + if (runp->subnext == NULL || runp->subnext->subsection_id > nr) + break; + + runp = runp->subnext; + } + + newp = (AsmScn_t *) malloc (sizeof (AsmScn_t)); + if (newp == NULL) + return NULL; + + /* Same assembler context than the original section. */ + newp->ctx = runp->ctx; + + /* User provided the subsectio nID. */ + newp->subsection_id = nr; + + /* Inherit the parent's type. */ + newp->type = runp->type; + + /* Pointer to the zeroth subsection. */ + newp->data.up = runp->subsection_id == 0 ? runp : runp->data.up; + + /* We start at offset zero. */ + newp->offset = 0; + /* And generic alignment. */ + newp->max_align = 1; + + /* No output yet. */ + newp->content = NULL; + + /* Inherit the fill pattern from the section this one is derived from. */ + newp->pattern = asmscn->pattern; + + /* Enqueue at the right position in the list. */ + newp->subnext = runp->subnext; + runp->subnext = newp; + + return newp; +} |