|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ ! 2: static char rcsid[] = "$Header: save.c,v 2.5 85/08/22 16:07:04 timo Exp $"; ! 3: ! 4: /* ! 5: * B editor -- Save Parse tree on file. ! 6: */ ! 7: ! 8: #include <ctype.h> ! 9: ! 10: #include "b.h" ! 11: #include "feat.h" ! 12: #include "bobj.h" ! 13: #include "node.h" ! 14: #include "gram.h" ! 15: #include "queu.h" ! 16: ! 17: #define Indent " " /* Output for each indentation level */ ! 18: ! 19: Hidden int spaces = 0; /* Saved-up spaces; emitted when non-blank found */ ! 20: ! 21: #ifdef BTOP ! 22: #include <setjmp.h> ! 23: ! 24: Hidden bool piping; /* Set if output goes to B interpreter */ ! 25: Hidden jmp_buf alas; /* Where to go when no command prompt gotten */ ! 26: #endif ! 27: ! 28: /* ! 29: * Write the representation of a node. If it has children, ! 30: * they are written by recursive calls. ! 31: */ ! 32: ! 33: Hidden Procedure ! 34: savewalk(n, level, file) ! 35: node n; ! 36: int level; ! 37: FILE *file; ! 38: { ! 39: string *rp; ! 40: string cp; ! 41: int nch; ! 42: int i; ! 43: char c; ! 44: ! 45: if (Type(n) == Tex) { ! 46: for (; spaces > 0; --spaces) ! 47: putc(' ', file); ! 48: fputs(Str((value)n), file); ! 49: return; ! 50: } ! 51: nch = nchildren(n); ! 52: rp = noderepr(n); ! 53: for (i = 0; i <= nch; ++i) { ! 54: if (i) ! 55: savewalk(child(n, i), level, file); ! 56: cp = rp[i]; ! 57: if (cp) { ! 58: for (; c = *cp; ++cp) { ! 59: switch (c) { ! 60: ! 61: case '\n': ! 62: case '\r': ! 63: putc('\n', file); ! 64: #ifdef BTOP ! 65: if (piping) { ! 66: if (!expect(">>> ")) ! 67: longjmp(alas, 1); ! 68: } ! 69: #endif BTOP ! 70: if (c == '\n') ! 71: for (i = level; i > 0; --i) ! 72: fputs(Indent, file); ! 73: spaces = 0; ! 74: break; ! 75: ! 76: case '\b': ! 77: --level; ! 78: break; ! 79: ! 80: case '\t': ! 81: ++level; ! 82: break; ! 83: ! 84: case ' ': ! 85: ++spaces; ! 86: break; ! 87: ! 88: default: ! 89: for (; spaces > 0; --spaces) ! 90: putc(' ', file); ! 91: putc(c, file); ! 92: break; ! 93: ! 94: } ! 95: } ! 96: } ! 97: } ! 98: } ! 99: ! 100: ! 101: /* ! 102: * Save the entire Parse tree. ! 103: */ ! 104: ! 105: Visible bool ! 106: save(p, filename) ! 107: path p; ! 108: string filename; ! 109: { ! 110: FILE *file = fopen(filename, "w"); ! 111: ! 112: if (!file) ! 113: return No; ! 114: #ifdef BTOP ! 115: piping = No; ! 116: #endif BTOP ! 117: sendsave(p, file); ! 118: return fclose(file) != EOF; ! 119: } ! 120: ! 121: ! 122: Hidden Procedure ! 123: sendsave(p, file) ! 124: path p; ! 125: FILE *file; ! 126: { ! 127: p = pathcopy(p); ! 128: top(&p); ! 129: spaces = 0; ! 130: savewalk(tree(p), 0, file); ! 131: putc('\n', file); ! 132: pathrelease(p); ! 133: } ! 134: ! 135: #ifdef BTOP ! 136: ! 137: /* ! 138: * Interface to top level. ! 139: */ ! 140: ! 141: Visible bool ! 142: send(p, pdown) ! 143: path p; ! 144: FILE *pdown; ! 145: { ! 146: piping = Yes; ! 147: if (setjmp(alas)) { ! 148: pathrelease(p); ! 149: return No; ! 150: } ! 151: sendsave(p, pdown); ! 152: if (expect(">>> ")) ! 153: putc('\n', pdown); ! 154: return Yes; ! 155: } ! 156: #endif BTOP ! 157: ! 158: /* ------------------------------------------------------------------ */ ! 159: ! 160: #ifdef SAVEBUF ! 161: ! 162: /* ! 163: * Write a node. ! 164: */ ! 165: ! 166: Hidden Procedure ! 167: writenode(n, fp) ! 168: node n; ! 169: FILE *fp; ! 170: { ! 171: int nch; ! 172: int i; ! 173: ! 174: if (!n) { ! 175: fputs("(0)", fp); ! 176: return; ! 177: } ! 178: if (((value)n)->type == Tex) { ! 179: writetext((value)n, fp); ! 180: return; ! 181: } ! 182: nch = nchildren(n); ! 183: fprintf(fp, "(%s", symname(symbol(n))); ! 184: for (i = 1; i <= nch; ++i) { ! 185: putc(',', fp); ! 186: writenode(child(n, i), fp); ! 187: } ! 188: fputc(')', fp); ! 189: } ! 190: ! 191: ! 192: Hidden Procedure ! 193: writetext(v, fp) ! 194: value v; ! 195: FILE *fp; ! 196: { ! 197: string str; ! 198: int c; ! 199: ! 200: Assert(v && Type(v) == Tex); ! 201: putc('\'', fp); ! 202: str = Str(v); ! 203: for (str = Str(v); *str; ++str) { ! 204: c = *str; ! 205: if (c == ' ' || isprint(c)) { ! 206: putc(c, fp); ! 207: if (c == '\'' || c == '`') ! 208: putc(c, fp); ! 209: } ! 210: else if (isascii(c)) ! 211: fprintf(fp, "`$%d`", c); ! 212: } ! 213: putc('\'', fp); ! 214: } ! 215: ! 216: ! 217: Visible bool ! 218: savequeue(v, filename) ! 219: value v; ! 220: string filename; ! 221: { ! 222: register FILE *fp; ! 223: auto queue q = (queue)v; ! 224: register node n; ! 225: register bool ok; ! 226: register int lines = 0; ! 227: ! 228: fp = fopen(filename, "w"); ! 229: if (!fp) ! 230: return No; ! 231: q = qcopy(q); ! 232: while (!emptyqueue(q)) { ! 233: n = queuebehead(&q); ! 234: writenode(n, fp); ! 235: putc('\n', fp); ! 236: ++lines; ! 237: noderelease(n); ! 238: } ! 239: ok = fclose(fp) != EOF; ! 240: if (!lines) ! 241: /* Try to */ unlink(filename); /***** UNIX! *****/ ! 242: return ok; ! 243: } ! 244: #endif SAVEBUF
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.