/* 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; }