diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-02 15:44:01 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-02 15:44:01 +0300 |
commit | 3ffce190be7a1d11725c224fa76876d2b621d00d (patch) | |
tree | b4a0e665b7b106f448c7cf9ddebda8b26ceb0a64 /obstack.c | |
download | egawk-3ffce190be7a1d11725c224fa76876d2b621d00d.tar.gz egawk-3ffce190be7a1d11725c224fa76876d2b621d00d.tar.bz2 egawk-3ffce190be7a1d11725c224fa76876d2b621d00d.zip |
Initial commit, gawk 1.01 sources.
Diffstat (limited to 'obstack.c')
-rw-r--r-- | obstack.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/obstack.c b/obstack.c new file mode 100644 index 00000000..66148106 --- /dev/null +++ b/obstack.c @@ -0,0 +1,157 @@ +/* obstack.c - subroutines used implicitly by object stack macros + Copyright (c) 1986 Free Software Foundation, Inc. + + NO WARRANTY + + BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY +NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT +WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, +RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS" +WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY +AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M. +STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY +WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE +LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR +OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR +DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR +A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS +PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. + + GENERAL PUBLIC LICENSE TO COPY + + 1. You may copy and distribute verbatim copies of this source file +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy a valid copyright notice "Copyright +(C) 1986 Free Software Foundation, Inc."; and include following the +copyright notice a verbatim copy of the above disclaimer of warranty +and of this License. + + 2. You may modify your copy or copies of this source file or +any portion of it, and copy and distribute such modifications under +the terms of Paragraph 1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating + that you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, + that in whole or in part contains or is a derivative of this + program or any part thereof, to be freely distributed + and licensed to all third parties on terms identical to those + contained in this License Agreement (except that you may choose + to grant more extensive warranty protection to third parties, + at your option). + + 3. You may copy and distribute this program or any portion of it in +compiled, executable or object code form under the terms of Paragraphs +1 and 2 above provided that you do the following: + + a) cause each such copy to be accompanied by the + corresponding machine-readable source code, which must + be distributed under the terms of Paragraphs 1 and 2 above; or, + + b) cause each such copy to be accompanied by a + written offer, with no time limit, to give any third party + free (except for a nominal shipping charge) a machine readable + copy of the corresponding source code, to be distributed + under the terms of Paragraphs 1 and 2 above; or, + + c) in the case of a recipient of this program in compiled, executable + or object code form (without the corresponding source code) you + shall cause copies you distribute to be accompanied by a copy + of the written offer of source code which you received along + with the copy you received. + + 4. You may not copy, sublicense, distribute or transfer this program +except as expressly provided under this License Agreement. Any attempt +otherwise to copy, sublicense, distribute or transfer this program is void and +your rights to use the program under this License agreement shall be +automatically terminated. However, parties who have received computer +software programs from you with this License Agreement will not have +their licenses terminated so long as such parties remain in full compliance. +*/ + +#include <obstack.h> + +void +_obstack_begin (h, chunkfun) + struct obstack *h; + int (*chunkfun) (); +{ + register _Ll* chunk; /* points to new chunk */ + chunk = h->chunk = + (_Ll*) (*chunkfun) (h->chunk_size); + h->next_free = h->object_base = chunk->obstack_l_0; + h->chunk_limit = chunk->obstack_l_limit + = (char *) chunk + h->chunk_size; + chunk->obstack_l_prev = 0; +} + +/* Allocate a new current chunk for the obstack *H + on the assumption that LENGTH bytes need to be added + to the current object, or a new object of length LENGTH allocated. + Copies any partial object from the end of the old chunk + to the beginning of the new one. */ + +void +_obstack_newchunk (h, chunkfun, length) + struct obstack *h; + int (*chunkfun) (); + int length; +{ + register _Ll* old_chunk = h->chunk; + register _Ll* new_chunk; + register long new_size; + register int obj_size = h->next_free - h->object_base; + + /* Compute size for new chunk. */ + new_size = (obj_size + length) << 1; + if (new_size < h->chunk_size) + new_size = h->chunk_size; + + /* Allocate and initialize the new chunk. */ + new_chunk = h->chunk = (_Ll*) (*chunkfun) (new_size); + new_chunk->obstack_l_prev = old_chunk; + new_chunk->obstack_l_limit = h->chunk_limit = (char *) new_chunk + new_size; + + /* Move the existing object to the new chunk. */ + bcopy (h->object_base, new_chunk->obstack_l_0, obj_size); + h->object_base = new_chunk->obstack_l_0; + h->next_free = h->object_base + obj_size; + }; + +void +_obstack_free (h, freechunkfun, obj) + struct obstack *h; + void (*freechunkfun) (); + char *obj; +{ + register _Ll* lp; /* below addr of any objects in this chunk */ + register _Ll* plp; /* point to previous chunk if any */ + + lp = (h)->chunk; + while (lp != 0 && ((char *)lp > obj || (h)->chunk_limit < obj)) + { + plp = lp -> obstack_l_prev; + (*freechunkfun) (lp); + if(lp==plp) + plp=0; + lp = plp; + } + if (lp) + { + (h)->object_base = (h)->next_free = (char *)(obj); + (h)->chunk_limit = lp->obstack_l_limit; + (h)->chunk = lp; + } + else if (obj != 0) + /* obj is not in any of the chunks! */ + abort (); +} |