fmtbuf.c revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy/***********************************************************************
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* This software is part of the ast package *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* Copyright (c) 1985-2008 AT&T Intellectual Property *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* and is licensed under the *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* Common Public License, Version 1.0 *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* by AT&T Intellectual Property *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* A copy of the License is available at *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* http://www.opensource.org/licenses/cpl1.0.txt *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* Information and Software Systems Research *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* AT&T Research *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* Florham Park NJ *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* Glenn Fowler <gsf@research.att.com> *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* David Korn <dgk@research.att.com> *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* Phong Vo <kpv@research.att.com> *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy* *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy***********************************************************************/
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#pragma prototyped
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#include <ast.h>
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy/*
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * return small format buffer chunk of size n
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * spin lock for thread access
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy * format buffers are short lived
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * only one concurrent buffer with size > sizeof(buf)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic char buf[16 * 1024];
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic char* nxt = buf;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic int lck = -1;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic char* big;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic size_t bigsiz;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedychar*
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfmtbuf(size_t n)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy register char* cur;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while (++lck)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lck--;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (n > (&buf[elementsof(buf)] - nxt))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy {
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (n > elementsof(buf))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy {
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (n > bigsiz)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy {
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy bigsiz = roundof(n, 8 * 1024);
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy if (!(big = newof(big, char, bigsiz, 0)))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy {
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lck--;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0;
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy }
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy }
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lck--;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return big;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy }
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy nxt = buf;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy }
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy cur = nxt;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy nxt += n;
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy lck--;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return cur;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy