Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/agcore/stacks.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children | 57b2cc9b87f7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/agcore/stacks.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,853 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * stacks.cpp + */ + +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include "port.h" + +#ifdef VACLGUI +#include <icritsec.hpp> +#include "resource.h" +#endif + +#include "agstring.h" +#include "assert.h" +#include "dict.h" +#include "myalloc.h" +#include "stacks.h" + +//#define INCLUDE_LOGGING +#include "log.h" + + +#define cs char_strings_base +#define ws word_strings_base +#define ls long_strings_base +#define is int_stack_base +#define ni int_stack_top + +static char *cs; +static int *ws; +static int *is; +static unsigned lcs,lws, lis; +unsigned ni; +unsigned nc; +unsigned nw; +static unsigned lcx; +static unsigned lwx; +static unsigned llx; +char *string_base; +int *list_base; + +#ifdef VACLGUI +static AgResource charStackResource; +#endif + + +void init_stk(void) { + LOGSECTION("init_stk"); + lcs = 100; + lws = 100; + lis = 20; + cs = (char *) myalloc(lcs); + ws = (int *) myalloc(lws * sizeof(*ws)); + is = (int *) myalloc((lis+1) * sizeof(*is)); + nc = nw = ni = lcx = lwx = llx = 0; +} + +/* +void logStringStack() { + //LOGSECTION("Stack status"); + log.line() << nc << nw << ni; + log.line() << lcs << lws << lis; +} +*/ +/* +void delete_stack(void) { + DEALLOCATE(cs); + DEALLOCATE(ws); + DEALLOCATE(is); +} +*/ +/* +void slide_stack(void) { + cs = (char *) myrealloc(cs, lcs, __FILE__, __LINE__); + ws = (int *) myrealloc(ws, lws * sizeof(*ws), __FILE__, __LINE__); + is = (int *) myrealloc(is, (lis+1) * sizeof(*is), __FILE__, __LINE__); +} +*/ +void reset_stk(void) { + nc = nw = ni = lcx = lwx = llx = 0; +} + +/* +void slns(const char *s) { / * extract line from string * / + int n; + const char *sp; + + ics(); + n = 0; + if (s) for (sp = s; *sp && *sp != '\n'; sp++) { + if (*sp == '\t') do acs(' '); while (++n % tab_spacing); + else acs(*sp), n++; + } + cs[nc] = 0; +} +*/ + +char *string_space(int n) { + if (nc + n >= lcs) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + LOGSECTION("string_space::resize"); + LOGV(lcs) LCV(nc) LCV(n); + + unsigned k = lcs + (lcs >> 1) + n + 1; + if (k > MAX_BYTES) k = (unsigned) MAX_BYTES; + lcs = k - 1; + LOGV(lcs) LCV(nc) LCV(n); + assert(lcs >= nc+n); + cs = reallocate(cs,k,char); + string_base = &cs[lcx]; + } + return &cs[nc]; +} + +int *list_space(int n) { + if (nw + n >= lws) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + unsigned k = lws + (lws >> 1) + n + 1; + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k - 1; + LOGSECTION("list_space::resize"); + LOGV(lws) LCV(nw+n); + assert(lws >= nw+n); + REALLOCATE_ST(ws,k); + list_base = &ws[lwx]; + } + return &ws[nw]; +} + +void sss(const char *s) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int n; + + assert(s != NULL); + n = strlen(s); + if (ni + 1 >= lis) { + unsigned k = lis + 3 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k-1; + LOGSECTION("sss::resize"); + LOGV(lis) LCV(ni+2); + assert(lis >= ni+2); + REALLOCATE_ST(is,k); + } + is[ni++] = lcx; + if (nc + n >= lcs) { + unsigned k = lcs + (lcs >> 1) + n + 1; + if (k > MAX_BYTES) { + k = (unsigned) MAX_BYTES; + } + lcs = k - 1; + LOGSECTION("sss::resize"); + LOGV(lcs) LCV(nc+n); + assert(lcs >= nc + n); + cs = reallocate(cs,k,char); + } + lcx = nc; + string_base = &cs[lcx]; + strncpy(string_base,s,n); + nc += is[ni++] = n; + cs[nc] = 0; +} + +void ass(const char *s) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int n; + + assert(s !=NULL); + assert(ni>=2); + n = strlen(s); + if (nc + n >= lcs) { + unsigned k = lcs + (lcs >> 1) + n + 1; + if (k > MAX_BYTES) { + k = (unsigned) MAX_BYTES; + } + lcs = k-1; + LOGSECTION("ass::resize"); + LOGV(lcs) LCV(nc+n); + assert(lcs >= nc + n); + cs = reallocate(cs,k,char); + string_base = &cs[lcx]; + } + strncpy(&cs[nc], s, n); + nc += n; + is[ni-1] += n; + cs[nc] = 0; +} + +/* +static void extend_string(int n) { + LOGSECTION("extend_string"); + LOGV(nc) LCV(n); + is[ni-1] += n; + nc += n; + assert(nc < lcs); +} +*/ + +int ssprintf(const char *fs, ...) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + va_list ap; + int n; + + check_stack; + if (ni + 1 >= lis) { + unsigned k = lis + 3 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + LOGSECTION("ssprintf::resize"); + LOGV(lis) LCV(ni+2); + assert(lis >= ni+2); + REALLOCATE_ST(is,k); + } + is[ni++] = lcx; + string_space(500); + lcx = nc; + string_base = &cs[lcx]; + va_start(ap,fs); + n = is[ni++] = vsprintf(&cs[nc],fs,ap); + nc += n; + assert(nc < lcs); + va_end(ap); + return n; +} + +int apprintf(const char *fs, ...) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + va_list ap; + int n; + + assert(ni>=2); + string_space(500); + va_start(ap,fs); + is[ni-1] += (n = vsprintf(&cs[nc],fs,ap)); + nc += n; + assert(nc < lcs); + va_end(ap); + return n; +} + +void tss(void) { + cs[nc] = 0; +} + +void ics(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //check_stack; + if (ni + 2 > lis) { + unsigned k = lis + 3 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + LOGSECTION("ics::resize"); + LOGV(lis) LCV(ni+2); + assert(lis >= ni+2); + REALLOCATE_ST(is,k); + } + is[ni++] = lcx; + lcx = nc; + string_base = &cs[lcx]; + is[ni++] = 0; + cs[nc] = 0; +} + +void scs(int c) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //check_stack; + if (ni + 1 >= lis) { + unsigned k = lis + 3 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + LOGSECTION("scs::resize"); + LOGV(lis) LCV(ni+2); + assert(lis >= ni+2); + REALLOCATE_ST(is,k); + } + is[ni++] = lcx; + if (nc + 1 >= lcs) { + unsigned k = lcs + 2 + (lcs >> 1); + if (k > MAX_BYTES) { + k = (unsigned) MAX_BYTES; + } + lcs = k - 1; + LOGSECTION("scs::resize"); + LOGV(lcs) LCV(nc+1); + assert(lcs >= nc+1); + cs = reallocate(cs,k,char); + } + lcx = nc; + string_base = &cs[lcx]; + cs[nc++] = (char) c; + is[ni++] = 1; + cs[nc] = 0; +} + +#if 0 /* NOTUSED */ +void ist(void) { /* init string table */ + check_stack; + if (ni + 4 >= lis) { + unsigned k = lis + 5 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + assert(lis >= ni+4); + REALLOCATE_ST(is,k); + } + is[ni++] = lwx; + is[ni++] = lcx; + lwx = nw; + list_base = &ws[lwx]; + is[ni++] = nc; + lcx = nc; + string_base = &cs[lcx]; + is[ni++] = 0; + ws[nw++] = 0; +} +#endif /* 0 - NOTUSED */ + +void iws(void) { /* init word stack */ +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //check_stack; + if (ni + 2 >= lis) { + unsigned k = lis + 3 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + LOGSECTION("iws::resize"); + LOGV(lis) LCV(ni+2); + assert(lis >= ni+2); + REALLOCATE_ST(is,k); + } + is[ni++] = lwx; + lwx = nw; + list_base = &ws[lwx]; + is[ni++] = 0; +} + +void sws(int c) { /* store word on stack */ +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //check_stack; + if (ni + 1 >= lis) { + unsigned k = lis + 3 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + LOGSECTION("sws::resize"); + LOGV(lis) LCV(ni+2); + assert(lis >= ni+2); + REALLOCATE_ST(is,k); + } + is[ni++] = lwx; + if (nw >= lws) { + unsigned k = lws + 2 + (lws >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k - 1; + LOGSECTION("sws::resize"); + LOGV(lws) LCV(nw+2); + assert(lws >= nw+1); + REALLOCATE_ST(ws,k); + } + lwx = nw; + list_base = &ws[lwx]; + ws[nw++] = c; + is[ni++] = 1; +} + +int rcs(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //LOGSECTION("rcs"); + int n; + + assert(ni >= 2); + n = is[--ni]; + LOGV(nc) LCV(lcx) LCV(n); + assert(nc == lcx + n); + cs[nc] = 0; + nc = lcx; + lcx = is[--ni]; + string_base = &cs[lcx]; + return n; +} + +int fps(FILE *f) { /* put string to file */ + int n; + + char *sb; + sb = string_base; + n = rcs(); + fputs(sb,f); + return n; +} + +int rps(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int n; + + assert(ni >= 2); + n = 2*is[--ni]; + assert(nw == lwx + n); + nw = lwx; + lwx = is[--ni]; + list_base = &ws[lwx]; + return n; +} + +int rws(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int n; + + assert(ni >= 2); + n = is[--ni]; + assert(nw == lwx + n); + nw = lwx; + lwx = is[--ni]; + list_base = &ws[lwx]; + return n; +} + + +void sis(int i) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //check_stack; + if (ni >= lis) { + unsigned k = lis + 2 + (lis >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lis = k - 1; + LOGSECTION("sis::resize"); + LOGV(lis) LCV(ni+2); + assert (lis >= ni+1); + REALLOCATE_ST(is,k); + } + is[ni++] = i; +} + + +int tis(void) { + assert(ni >= 1); + return is[ni-1]; +} + +int fis(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + assert(ni >= 1); + return is[--ni]; +} + +void concat_string(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif +// check_stack; + assert(ni >= 4); + ni -= 2; + lcx = is[ni]; + string_base = &cs[lcx]; + is[ni-1] += is[ni+1]; +} + +void concat_list(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + //check_stack; + assert(ni >= 2); + ni -= 2; + lwx = is[ni]; + list_base = &ws[lwx]; + is[ni-1] += is[ni+1]; +} + +/* +void its(char c,int n) { + assert(ni>=2); + while (n > is[ni-1]) acs(' '); + if (n == is[ni-1]) {acs(c); return;} + if (nc + 1 >= lcs) { + unsigned k = lcs + 1 + (lcs >> 1); + if (k > MAX_BYTES) { + k = (unsigned) MAX_BYTES; + } + lcs = k - 1; + assert(lcs > nc); + cs = reallocate(cs,k,char); + string_base = &cs[lcx]; + } + memmove(&cs[lcx+n+1],&cs[lcx+n],sizeof(*cs)*(is[ni-1]-n)); + cs[lcx+n] = c; + (is[ni-1])++; + cs[++nc] = 0; +} +*/ + +void acs(int c) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + assert(ni>=2); + if (nc + 1 >= lcs) { + unsigned k = lcs + 2 + (lcs >> 1); + if (k > MAX_BYTES) { + k = (unsigned) MAX_BYTES; + } + lcs = k - 1; + LOGSECTION("acs::resize"); + LOGV(lcs) LCV(nc); + assert(lcs > nc); + cs = reallocate(cs,k,char); + string_base = &cs[lcx]; + } + cs[nc++] = (char) c; + cs[nc] = 0; + (is[ni-1])++; +} + +int isws(int c) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int bx, tx; + unsigned nx; + check_stack; + assert(ni>=2); + if (nw >= lws) { + unsigned k = lws + 2 + (lws >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k-1; + LOGSECTION("isws::resize"); + LOGV(lws) LCV(nw); + assert(lws > nw); + REALLOCATE_ST(ws,k); + list_base = &ws[lwx]; + } + if (nw == lwx) { + ws[nw++] = c; + is[ni-1]++; + return 0; + } + bx = lwx; + tx = nw-1; + while (bx <= tx) { + nx = (bx+tx)/2; + if (ws[nx] > c) { + tx = nx-1; + } + else if (ws[nx] < c) { + bx = nx + 1; + } + else { + return 1; + } + } + if (nw > (unsigned) bx) { + memmove(ws+bx+1,ws+bx, (nw-bx)*sizeof(*ws)); + } + ws[bx] = c; + nw++; + (is[ni-1])++; + return 0; +} + +int xws(int c) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int k; + int *p; + + assert(ni>=2); + if (nw >= lws) { + unsigned k = lws + 2 + (lws >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k - 1; + LOGSECTION("xws::resize"); + LOGV(lws) LCV(nw); + assert(lws > nw); + REALLOCATE_ST(ws,k); + list_base = &ws[lwx]; + } + k = nw - lwx; + p = list_base; + while (k--) { + if (c == *p++) { + return 1; + } + } + ws[nw++] = c; + (is[ni-1])++; + return 0; +} + +int xps(int c1,int c2) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + unsigned i; + int *p; + int flag; + + // some compilers fail to be able to unravel the loop below to show + // that this isn't necessary + flag = -1; + + assert(ni>=2); + if (nw + 2 >= lws) { + unsigned k = lws + 3 + (lws >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k - 1; + LOGSECTION("xps::resize"); + LOGV(lws) LCV(nw + 2); + assert(lws >= nw + 2); + REALLOCATE_ST(ws,k); + list_base = &ws[lwx]; + } + for (p = list_base, i = lwx; + i < nw && ((flag = p[0] - c1) < 0 || + (flag == 0 && (flag = p[1] - c2) < 0)); + p += 2, i += 2); + if (i < nw && flag == 0) { + return 1; + } + memmove(p+2, p, (nw - i)* sizeof(*p)); + *p++ = c1; *p = c2; + nw += 2; + (is[ni-1])++; + return 0; +} + +void aws(int c) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + assert(ni>=2); + if (nw >= lws) { + unsigned k = lws + 2 + (lws >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k - 1; + LOGSECTION("aws::resize"); + LOGV(lws) LCV(nw); + assert(lws > nw); + REALLOCATE_ST(ws,k); + list_base = &ws[lwx]; + } + ws[nw++] = c; + (is[ni-1])++; +} + +char *build_string(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + char *h; + unsigned n; + + check_stack; + assert(ni >= 2); + n = is[--ni]; + lcx = is[--ni]; + string_base = &cs[lcx]; + assert(nc >= n); + nc -= n; + h = ALLOCATE(n+1, char); + memmove(h, cs + nc, n*sizeof(*h)); + h[n] = 0; + return h; +} + +AgString buildAgString(void) { + char *sb; + sb = string_base; + return AgString(sb,rcs()); +} + +AgArray<int> buildStaticList(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + unsigned n; + + //check_stack; + assert(ni >= 1); + n = is[--ni]; + lwx = is[--ni]; + list_base = &ws[lwx]; + assert(nw >= n); + nw -= n; + return AgArray<int>(ws+nw, n); +} + +int *build_list(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int *h; + unsigned n; + + //check_stack; + assert(ni >= 1); + n = is[--ni]; + lwx = is[ni-1]; + list_base = &ws[lwx]; + assert(nw >= n); + nw -= n; + is[ni-1] = n; + if (n == 0) h = NULL; + else ALLOCATE_ST(h, n); + memmove(h,ws + nw, n*sizeof(*ws)); + return h; +} +/* +static void rtbc(void) { + assert(ni>=2); + if (cs[nc-1] != ' ') return; + nc--; + is[ni-1]--; + cs[nc] = 0; +} +*/ + +int idl(list_dict *d) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int k,nsx; + int *lb; + + check_stack; + assert(ni>=2); + nsx = d->nsx; + lb = list_base; + k = add_list_dict(lb, rws(), d); + sis(k); + return k == nsx; +} + +int fws(void) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + assert(nw > 0); + is[ni-1]--; + return(ws[--nw]); +} + +void fdl(list_dict *d,unsigned k) { +#ifdef VACLGUI + AgLock lock(charStackResource); +#endif + int n, *l; + + assert(k < d->nsx); + iws(); + l = d->text + d->ndx[k]; + n = *l++ - 1; + if (nw + n >= lws) { + unsigned k = lws + n + 1 + (lws >> 1); + if (k > MAX_INTS) { + k = (unsigned) MAX_INTS; + } + lws = k - 1; + LOGSECTION("fdl::resize"); + LOGV(lws) LCV(nw + n); + assert(lws >= nw+n); + REALLOCATE_ST(ws,k); + list_base = &ws[lwx]; + } + memmove(list_base, l, n*sizeof(*list_base)); + nw += n; + is[ni-1] = n; +} + +//int idsx(string_dict *); +/* +int ids(string_dict *d) { + rtbc(); + return idsx(d); +} + +static int idsx(string_dict *d) { + int k,nsx; + char *sb; + + check_stack; + assert(ni>=2); + cs[nc] = 0; + sb = string_base; + rcs(); + nsx = d->nsx; + k = add_string_dict(sb, d); + is[ni++] = k; + cs[nc] = 0; + return k == nsx; +} +*/