diff options
author | John Gilmore <gnu@cygnus> | 1992-02-22 08:17:01 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1992-02-22 08:17:01 +0000 |
commit | 021959e249f6aaddc39b5c61f692cd9155e33f52 (patch) | |
tree | 0b96c8808917805c20bbca995a14dc4140b4110f /gdb/dbxread.c | |
parent | f48e5efef7dfd67534c651172172f3ddb2b46e4d (diff) | |
download | gdb-021959e249f6aaddc39b5c61f692cd9155e33f52.zip gdb-021959e249f6aaddc39b5c61f692cd9155e33f52.tar.gz gdb-021959e249f6aaddc39b5c61f692cd9155e33f52.tar.bz2 |
* xm-sun3os4.h, xm-sun4os4.h: Enable HAVE_MMAP.
* minsyms.c (install_minimal_symbols): Add bunches to any
existing minsyms in the objfile. Avoid extra mallocation
by working directly in the obstack. Remove ignored `mainline' parm.
* coffread.c, dbxread.c, elfread.c, mipsread.c, solib.c, symtab.h,
xcoffread.c: Change all callers.
* FIXME: We should be able to eliminate MAINLINE from all the
symbol readers now, with a small bit of work.
* valops.c, value.h: Lint.
* remote-vx.c: Add missing break; statement. Bugfix by
Michael Sclafani, <sclafani@src.dec.com>.
Diffstat (limited to 'gdb/dbxread.c')
-rw-r--r-- | gdb/dbxread.c | 342 |
1 files changed, 157 insertions, 185 deletions
diff --git a/gdb/dbxread.c b/gdb/dbxread.c index cc89708..5e002df 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -44,7 +44,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <obstack.h> #include <sys/param.h> +#ifndef NO_SYS_FILE #include <sys/file.h> +#endif #include <sys/stat.h> #include <ctype.h> #include "symtab.h" @@ -91,20 +93,6 @@ struct symloc { int ldsymlen; }; -extern void qsort (); -extern double atof (); - -/* Forward declarations */ - -static void read_dbx_symtab (); -static void init_psymbol_list (); -extern void process_one_symbol (); -void start_subfile (); -int hashname (); -static struct pending *copy_pending (); -static struct symtab *read_ofile_symtab (); -static void dbx_psymtab_to_symtab (); - /* Macro to determine which symbols to ignore when reading the first symbol of a file. Some machines override this definition. */ #ifndef IGNORE_SYMBOL @@ -192,10 +180,74 @@ struct header_file_location static struct header_file_location *bincl_list, *next_bincl; static int bincls_allocated; +/* Local function prototypes */ + +static void +free_and_init_header_files PARAMS ((void)); + +static struct pending * +copy_pending PARAMS ((struct pending *, int, struct pending *)); + +static struct symtab * +read_ofile_symtab PARAMS ((struct objfile *, char *, unsigned int, int, int, + CORE_ADDR, int, int)); + +static void +dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *)); + +static void +psymtab_to_symtab_1 PARAMS ((struct partial_symtab *, char *, int, int)); + +static void +read_dbx_symtab PARAMS ((CORE_ADDR, struct objfile *, char *, long, int, + CORE_ADDR, int)); + +static void +free_bincl_list PARAMS ((struct objfile *)); + +static struct partial_symtab * +find_corresponding_bincl_psymtab PARAMS ((char *, int)); + +static void +add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int)); + +static void +init_bincl_list PARAMS ((int, struct objfile *)); + +static void +init_psymbol_list PARAMS ((int, struct objfile *)); + +static char * +dbx_next_symbol_text PARAMS ((void)); + +static void +fill_symbuf PARAMS ((bfd *)); + +static void +dbx_symfile_init PARAMS ((struct sym_fns *)); + +static void +dbx_new_init PARAMS ((void)); + +static void +dbx_symfile_read PARAMS ((struct sym_fns *, CORE_ADDR, int)); + +static void +record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *)); + +static void +add_new_header_file PARAMS ((char *, int)); + +static void +add_old_header_file PARAMS ((char *, int)); + +static void +add_this_object_header_file PARAMS ((int)); + /* Free up old header file tables, and allocate new ones. We're reading a new symbol file now. */ -void +static void free_and_init_header_files () { register int i; @@ -214,17 +266,6 @@ free_and_init_header_files () this_object_header_files = (int *) xmalloc (10 * sizeof (int)); } -/* Called at the start of each object file's symbols. - Clear out the mapping of header file numbers to header files. */ - -void -new_object_header_files () -{ - /* Leave FILENUM of 0 free for builtin types and this file's types. */ - n_this_object_header_files = 1; - header_file_prev_index = -1; -} - /* Add header file number I for this object file at the next successive FILENUM. */ @@ -236,7 +277,7 @@ add_this_object_header_file (i) { n_allocated_this_object_header_files *= 2; this_object_header_files - = (int *) xrealloc (this_object_header_files, + = (int *) xrealloc ((char *) this_object_header_files, n_allocated_this_object_header_files * sizeof (int)); } @@ -291,9 +332,8 @@ add_new_header_file (name, instance) { n_allocated_header_files *= 2; header_files = (struct header_file *) - xrealloc (header_files, - (n_allocated_header_files - * sizeof (struct header_file))); + xrealloc ((char *) header_files, + (n_allocated_header_files * sizeof (struct header_file))); } /* Create an entry for this header file. */ @@ -329,26 +369,27 @@ explicit_lookup_type (real_filenum, index) #endif static void -record_misc_function (name, address, type) +record_minimal_symbol (name, address, type, objfile) char *name; CORE_ADDR address; int type; + struct objfile *objfile; { - enum misc_function_type misc_type; + enum minimal_symbol_type ms_type; switch (type &~ N_EXT) { - case N_TEXT: misc_type = mf_text; break; - case N_DATA: misc_type = mf_data; break; - case N_BSS: misc_type = mf_bss; break; - case N_ABS: misc_type = mf_abs; break; + case N_TEXT: ms_type = mst_text; break; + case N_DATA: ms_type = mst_data; break; + case N_BSS: ms_type = mst_bss; break; + case N_ABS: ms_type = mst_abs; break; #ifdef N_SETV - case N_SETV: misc_type = mf_data; break; + case N_SETV: ms_type = mst_data; break; #endif - default: misc_type = mf_unknown; break; + default: ms_type = mst_unknown; break; } - prim_record_misc_function (obsavestring (name, strlen (name)), - address, misc_type); + prim_record_minimal_symbol (obsavestring (name, strlen (name), &objfile -> symbol_obstack), + address, ms_type); } /* Scan and build partial symbols for a symbol file. @@ -383,8 +424,8 @@ dbx_symfile_read (sf, addr, mainline) } /* If we are reinitializing, or if we have never loaded syms yet, init */ - if (mainline || global_psymbols.size == 0 || static_psymbols.size == 0) - init_psymbol_list (info->symcount); + if (mainline || sf->objfile->global_psymbols.size == 0 || sf->objfile->static_psymbols.size == 0) + init_psymbol_list (info->symcount, sf->objfile); /* FIXME POKING INSIDE BFD DATA STRUCTURES */ symbol_size = obj_symbol_entry_size (sym_bfd); @@ -392,8 +433,8 @@ dbx_symfile_read (sf, addr, mainline) pending_blocks = 0; make_cleanup (really_free_pendings, 0); - init_misc_bunches (); - make_cleanup (discard_misc_bunches, 0); + init_minimal_symbol_collection (); + make_cleanup (discard_minimal_symbols, 0); /* Now that the symbol table data of the executable file are all in core, process them and define symbols accordingly. */ @@ -404,19 +445,20 @@ dbx_symfile_read (sf, addr, mainline) bfd_section_vma (sym_bfd, info->text_sect), bfd_section_size (sym_bfd, info->text_sect)); - /* Go over the misc symbol bunches and install them in vector. */ + /* Install any minimal symbols that have been collected as the current + minimal symbols for this objfile. */ - condense_misc_bunches (!mainline); + install_minimal_symbols (sf -> objfile); /* Free up any memory we allocated for ourselves. */ if (!mainline) { - free (info->stringtab); /* Stringtab is only saved for mainline */ + (*sf->objfile->free) (info->stringtab); /* Stringtab is only saved for mainline */ } - free (info); - sf->sym_private = 0; /* Zap pointer to our (now gone) info struct */ + (*sf->objfile->free) (info); + sf->sym_private = NULL; /* Zap pointer to our (now gone) info struct */ - if (!partial_symtab_list) { + if (!have_partial_symbols ()) { wrap_here (""); printf_filtered ("(no debugging symbols found)..."); wrap_here (""); @@ -468,7 +510,7 @@ dbx_symfile_init (sf) unsigned char size_temp[4]; /* Allocate struct to keep track of the symfile */ - sf->sym_private = xmalloc (sizeof (*info)); + sf->sym_private = (*sf->objfile->xmalloc) (sizeof (*info)); info = (struct dbx_symfile_info *)sf->sym_private; /* FIXME POKING INSIDE BFD DATA STRUCTURES */ @@ -493,7 +535,8 @@ dbx_symfile_init (sf) if (info->stringtab_size >= 0) { - info->stringtab = (char *) xmalloc (info->stringtab_size); + /* Yes, this should be malloc, not xmalloc. We check its result. */ + info->stringtab = (char *) (*sf->objfile->malloc) (info->stringtab_size); /* Caller is responsible for freeing the string table. No cleanup. */ } else @@ -565,7 +608,7 @@ fill_symbuf (sym_bfd) (a \ at the end of the text of a name) call this function to get the continuation. */ -char * +static char * dbx_next_symbol_text () { if (symbuf_idx == symbuf_end) @@ -579,36 +622,38 @@ dbx_next_symbol_text () created by read_dbx_symtab and subsidiaries. */ static void -init_psymbol_list (total_symbols) +init_psymbol_list (total_symbols, objfile) int total_symbols; + struct objfile *objfile; { /* Free any previously allocated psymbol lists. */ - if (global_psymbols.list) - free (global_psymbols.list); - if (static_psymbols.list) - free (static_psymbols.list); + if (objfile -> global_psymbols.list) + (*objfile -> free) (objfile -> global_psymbols.list); + if (objfile -> static_psymbols.list) + (*objfile -> free) (objfile -> static_psymbols.list); /* Current best guess is that there are approximately a twentieth of the total symbols (in a debugging file) are global or static oriented symbols */ - global_psymbols.size = total_symbols / 10; - static_psymbols.size = total_symbols / 10; - global_psymbols.next = global_psymbols.list = (struct partial_symbol *) - xmalloc (global_psymbols.size * sizeof (struct partial_symbol)); - static_psymbols.next = static_psymbols.list = (struct partial_symbol *) - xmalloc (static_psymbols.size * sizeof (struct partial_symbol)); + objfile -> global_psymbols.size = total_symbols / 10; + objfile -> static_psymbols.size = total_symbols / 10; + objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *) + (*objfile -> xmalloc) (objfile -> global_psymbols.size * sizeof (struct partial_symbol)); + objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *) + (*objfile -> xmalloc) (objfile -> static_psymbols.size * sizeof (struct partial_symbol)); } /* Initialize the list of bincls to contain none and have some allocated. */ static void -init_bincl_list (number) +init_bincl_list (number, objfile) int number; + struct objfile *objfile; { bincls_allocated = number; next_bincl = bincl_list = (struct header_file_location *) - xmalloc (bincls_allocated * sizeof(struct header_file_location)); + (*objfile -> xmalloc) (bincls_allocated * sizeof(struct header_file_location)); } /* Add a bincl to the list. */ @@ -624,7 +669,7 @@ add_bincl_to_list (pst, name, instance) int offset = next_bincl - bincl_list; bincls_allocated *= 2; bincl_list = (struct header_file_location *) - xrealloc ((char *)bincl_list, + (*pst->objfile->xrealloc) ((char *)bincl_list, bincls_allocated * sizeof (struct header_file_location)); next_bincl = bincl_list + offset; } @@ -655,9 +700,10 @@ find_corresponding_bincl_psymtab (name, instance) /* Free the storage allocated for the bincl list. */ static void -free_bincl_list () +free_bincl_list (objfile) + struct objfile *objfile; { - free (bincl_list); + (*objfile -> free) (bincl_list); bincls_allocated = 0; } @@ -721,8 +767,8 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen, old_chain = make_cleanup (free_objfile, objfile); /* Init bincl list */ - init_bincl_list (20); - make_cleanup (free_bincl_list, 0); + init_bincl_list (20, objfile); + make_cleanup (free_bincl_list, objfile); last_source_file = 0; @@ -769,7 +815,7 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen, rather than abort the symbol reading or flood the user with messages. */ #define SET_NAMESTRING()\ if (((unsigned)bufp->n_strx) >= stringtab_size) { \ - complain (&string_table_offset_complaint, symnum); \ + complain (&string_table_offset_complaint, (char *) symnum); \ namestring = "foo"; \ } else \ namestring = bufp->n_strx + stringtab @@ -801,7 +847,7 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen, dependency_list, dependencies_used); } - free_bincl_list (); + free_bincl_list (objfile); discard_cleanups (old_chain); } @@ -825,55 +871,17 @@ start_psymtab (objfile, addr, struct partial_symbol *static_syms; { struct partial_symtab *result = - (struct partial_symtab *) obstack_alloc (psymbol_obstack, - sizeof (struct partial_symtab)); - - result->addr = addr; - - result->filename = - (char *) obstack_alloc (psymbol_obstack, - strlen (filename) + 1); - strcpy (result->filename, filename); + start_psymtab_common(objfile, addr, + filename, textlow, global_syms, static_syms); - result->textlow = textlow; - result->read_symtab_private = (char *) obstack_alloc (psymbol_obstack, - sizeof (struct symloc)); - if (ldsymoff != -1) - LDSYMOFF(result) = ldsymoff; - - result->readin = 0; - result->symtab = 0; + result->read_symtab_private = (char *) + obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc)); + LDSYMOFF(result) = ldsymoff; result->read_symtab = dbx_psymtab_to_symtab; - result->globals_offset = global_syms - global_psymbols.list; - result->statics_offset = static_syms - static_psymbols.list; - - result->n_global_syms = 0; - result->n_static_syms = 0; - - /* Chain it to the list owned by the current object file. */ - result->objfile = objfile; - result->objfile_chain = objfile->psymtabs; - objfile->psymtabs = result; - return result; } -static int -compare_psymbols (s1, s2) - register struct partial_symbol *s1, *s2; -{ - register char - *st1 = SYMBOL_NAME (s1), - *st2 = SYMBOL_NAME (s2); - - if (st1[0] - st2[0]) - return st1[0] - st2[0]; - if (st1[1] - st2[1]) - return st1[1] - st2[1]; - return strcmp (st1 + 2, st2 + 2); -} - /* Close off the current usage of a partial_symbol table entry. This involves setting the correct number of includes (with a realloc), setting the high text mark, setting the symbol length in the @@ -885,6 +893,7 @@ compare_psymbols (s1, s2) Then the partial symtab is put on the global list. *** List variables and peculiarities of same. *** */ + void end_psymtab (pst, include_list, num_includes, capping_symbol_offset, capping_text, dependency_list, number_dependencies) @@ -898,21 +907,22 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset, /* struct partial_symbol *capping_global, *capping_static;*/ { int i; + struct objfile *objfile = pst -> objfile; if (capping_symbol_offset != -1) LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst); pst->texthigh = capping_text; pst->n_global_syms = - global_psymbols.next - (global_psymbols.list + pst->globals_offset); + objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset); pst->n_static_syms = - static_psymbols.next - (static_psymbols.list + pst->statics_offset); + objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset); pst->number_of_dependencies = number_dependencies; if (number_dependencies) { pst->dependencies = (struct partial_symtab **) - obstack_alloc (psymbol_obstack, + obstack_alloc (&objfile->psymbol_obstack, number_dependencies * sizeof (struct partial_symtab *)); memcpy (pst->dependencies, dependency_list, number_dependencies * sizeof (struct partial_symtab *)); @@ -923,23 +933,12 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset, for (i = 0; i < num_includes; i++) { struct partial_symtab *subpst = - (struct partial_symtab *) - obstack_alloc (psymbol_obstack, - sizeof (struct partial_symtab)); - - subpst->filename = - (char *) obstack_alloc (psymbol_obstack, - strlen (include_list[i]) + 1); - strcpy (subpst->filename, include_list[i]); - - /* Chain it to the list that this object file owns. */ - subpst->objfile = pst->objfile; - subpst->objfile_chain = pst->objfile->psymtabs; - pst->objfile->psymtabs = subpst; + allocate_psymtab (include_list[i], objfile); subpst->addr = pst->addr; - subpst->read_symtab_private = (char *) obstack_alloc (psymbol_obstack, - sizeof (struct symloc)); + subpst->read_symtab_private = + (char *) obstack_alloc (&objfile->psymbol_obstack, + sizeof (struct symloc)); LDSYMOFF(subpst) = LDSYMLEN(subpst) = subpst->textlow = @@ -948,7 +947,7 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset, /* We could save slight bits of space by only making one of these, shared by the entire set of include files. FIXME-someday. */ subpst->dependencies = (struct partial_symtab **) - obstack_alloc (psymbol_obstack, + obstack_alloc (&objfile->psymbol_obstack, sizeof (struct partial_symtab *)); subpst->dependencies[0] = pst; subpst->number_of_dependencies = 1; @@ -961,14 +960,9 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset, subpst->readin = 0; subpst->symtab = 0; subpst->read_symtab = dbx_psymtab_to_symtab; - - subpst->next = partial_symtab_list; - partial_symtab_list = subpst; } - /* Sort the global list; don't sort the static list */ - qsort (global_psymbols.list + pst->globals_offset, pst->n_global_syms, - sizeof (struct partial_symbol), compare_psymbols); + sort_pst_symbols (pst); /* If there is already a psymtab or symtab for a file of this name, remove it. (If there is a symtab, more drastic things also happen.) @@ -982,10 +976,6 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset, /* Throw away this psymtab, it's empty. We can't deallocate it, since it is on the obstack, but we can forget to chain it on the list. */ ; - } else { - /* Put the psymtab on the psymtab list */ - pst->next = partial_symtab_list; - partial_symtab_list = pst; } } @@ -1110,8 +1100,8 @@ dbx_psymtab_to_symtab (pst) #endif { #ifdef BROKEN_LARGE_ALLOCA - stringtab = (char *) xmalloc (stsize); - make_cleanup (free, stringtab); + stringtab = (char *) (*pst->objfile->xmalloc) (stsize); + make_cleanup (pst->objfile->free, stringtab); #else stringtab = (char *) alloca (stsize); #endif @@ -1148,7 +1138,7 @@ dbx_psymtab_to_symtab (pst) /* Match with global symbols. This only needs to be done once, after all of the symtabs and dependencies have been read in. */ - scan_file_globals (); + scan_file_globals (pst->objfile); /* Finish up the debug error message. */ if (info_verbose) @@ -1189,6 +1179,7 @@ read_ofile_symtab (objfile, stringtab, stringtab_size, sym_offset, unsigned max_symnum; register bfd *abfd; + current_objfile = objfile; subfile_stack = 0; stringtab_global = stringtab; @@ -1288,30 +1279,8 @@ read_ofile_symtab (objfile, stringtab, stringtab_size, sym_offset, } } - return end_symtab (text_offset + text_size, 0, 0, objfile); -} - -int -hashname (name) - char *name; -{ - register char *p = name; - register int total = p[0]; - register int c; - - c = p[1]; - total += c << 2; - if (c) - { - c = p[2]; - total += c << 4; - if (c) - total += p[3] << 6; - } - - /* Ensure result is positive. */ - if (total < 0) total += (1000 << 6); - return total % HASHSIZE; + current_objfile = NULL; + return (end_symtab (text_offset + text_size, 0, 0, objfile)); } /* This handles a single symbol from the symbol-file, building symbols @@ -1386,7 +1355,7 @@ process_one_symbol (type, desc, valu, name, offset) if (!colon_pos++ || (*colon_pos != 'f' && *colon_pos != 'F')) { - define_symbol (valu, name, desc, type); + define_symbol (valu, name, desc, type, our_objfile); break; } @@ -1400,19 +1369,19 @@ process_one_symbol (type, desc, valu, name, offset) new = pop_context (); /* Make a block for the local symbols within. */ finish_block (new->name, &local_symbols, new->old_blocks, - new->start_addr, valu); + new->start_addr, valu, our_objfile); } /* Stack must be empty now. */ if (context_stack_depth != 0) - complain (&lbrac_unmatched_complaint, symnum); + complain (&lbrac_unmatched_complaint, (char *) symnum); new = push_context (0, valu); - new->name = define_symbol (valu, name, desc, type); + new->name = define_symbol (valu, name, desc, type, our_objfile); break; case N_CATCH: /* Record the address at which this catch takes place. */ - define_symbol (valu+offset, name, desc, type); + define_symbol (valu+offset, name, desc, type, our_objfile); break; case N_LBRAC: @@ -1451,7 +1420,7 @@ process_one_symbol (type, desc, valu, name, offset) new = pop_context(); if (desc != new->depth) - complain (&lbrac_mismatch_complaint, symnum); + complain (&lbrac_mismatch_complaint, (char *) symnum); /* Some compilers put the variable decls inside of an LBRAC/RBRAC block. This macro should be nonzero if this @@ -1488,7 +1457,7 @@ process_one_symbol (type, desc, valu, name, offset) } /* Make a block for the local symbols within. */ finish_block (0, &local_symbols, new->old_blocks, - new->start_addr, valu); + new->start_addr, valu, our_objfile); } else { @@ -1536,10 +1505,12 @@ process_one_symbol (type, desc, valu, name, offset) && current_subfile->name[strlen(current_subfile->name)-1] == '/') { current_subfile->dirname = current_subfile->name; - current_subfile->name = obsavestring (name, strlen (name)); + current_subfile->name = + obsavestring (name, strlen (name), + &our_objfile -> symbol_obstack); break; } - (void)end_symtab (valu, 0, 0); + (void) end_symtab (valu, 0, 0, our_objfile); } start_symtab (name, NULL, valu); break; @@ -1596,7 +1567,7 @@ process_one_symbol (type, desc, valu, name, offset) { int i; struct symbol *sym = - (struct symbol *) xmalloc (sizeof (struct symbol)); + (struct symbol *) (*our_objfile -> xmalloc) (sizeof (struct symbol)); bzero (sym, sizeof *sym); SYMBOL_NAME (sym) = savestring (name, strlen (name)); SYMBOL_CLASS (sym) = LOC_BLOCK; @@ -1632,7 +1603,7 @@ process_one_symbol (type, desc, valu, name, offset) case N_PSYM: /* Parameter variable */ case N_LENG: /* Length of preceding symbol type */ if (name) - define_symbol (valu, name, desc, type); + define_symbol (valu, name, desc, type, our_objfile); break; /* The following symbol types we don't know how to process. Handle @@ -1652,7 +1623,7 @@ process_one_symbol (type, desc, valu, name, offset) case N_NBLCS: complain (&unknown_symtype_complaint, local_hex_string(type)); if (name) - define_symbol (valu, name, desc, type); + define_symbol (valu, name, desc, type, our_objfile); } previous_stab_code = type; @@ -1662,8 +1633,9 @@ process_one_symbol (type, desc, valu, name, offset) block for later fixup. */ static struct pending * copy_pending (beg, begi, end) - struct pending *beg, *end; + struct pending *beg; int begi; + struct pending *end; { struct pending *new = 0; struct pending *next; |