home *** CD-ROM | disk | FTP | other *** search
- /**
- * $Revision: 1.1 $
- * $Log: C:/AWK/OBSTACK.C_V $
- *
- * Rev 1.1 09 Sep 1988 18:31:36 vince
- * MC 5.1 version
- *
- * Rev 1.0 09 Sep 1988 18:03:28 vince
- * Original source
- *
- * 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.
- *
- * Modifications by Andrew D. Estes, July 1988
- */
-
- #include <stdio.h>
- #include "awk.h"
- #include "obstack.h"
-
- void _obstack_begin(h, chunkfun)
- struct obstack *h;
- void *(*chunkfun) ();
- {
- register _Ll *chunk; /* points to new chunk */
-
- chunk = h->chunk = (_Ll *) (*chunkfun) ((size_t) 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;
- void *(*chunkfun) ();
- INT length; /* was int -ADE- */
- {
- 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) ((size_t) 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();
- }