aboutsummaryrefslogtreecommitdiffstats
path: root/obstack.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2010-07-02 15:44:01 +0300
committerArnold D. Robbins <arnold@skeeve.com>2010-07-02 15:44:01 +0300
commit3ffce190be7a1d11725c224fa76876d2b621d00d (patch)
treeb4a0e665b7b106f448c7cf9ddebda8b26ceb0a64 /obstack.c
downloadegawk-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.c157
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 ();
+}