|
|
1.1 ! root 1: /* ! 2: * macros.c 1.8 ! 3: * ! 4: * Screen Handling Functions for Spreadsheet Program `vis' ! 5: * ! 6: * A. F. Gettier ! 7: * Bell Laboratories ! 8: * Update made 11/15/82 10:50:58 ! 9: * Retrieved 11/15/82 13:22:33 ! 10: */ ! 11: #include <math.h> ! 12: #include <stdio.h> ! 13: #include "curses.h" ! 14: #include "vis.h" ! 15: ! 16: extern int LINES, COLS; ! 17: extern struct qheader Fixup; ! 18: ! 19: extern struct colhdr Col; ! 20: extern struct rowhdr Row; ! 21: ! 22: /* ! 23: * duplicate a block of definitions ! 24: */ ! 25: duplicate( fr, fc, tr, tc, ar, ac ) ! 26: int fr, fc, tr, tc, ar, ac; ! 27: { ! 28: char tbuf[128]; ! 29: int i, or, oc, nr, nc; ! 30: struct rowlabel **r1; ! 31: struct node *n, *n2; ! 32: /* ! 33: * get the row offset ! 34: */ ! 35: or = ar - fr; ! 36: oc = ac - fc; ! 37: /* ! 38: * Now make all the copies ! 39: */ ! 40: r1 = Row.table; ! 41: for ( i=fr; i<=tr && i<Row.size; i++ ) { ! 42: n = r1[i]->next; ! 43: while ( n != 0 ) { ! 44: if ( n->col > tc ) break; ! 45: if ( n->col >= fc ) { ! 46: nr = n->row + or; ! 47: nc = n->col + oc; ! 48: n2 = getnode( nr, nc ); ! 49: (void)strcat(strcpy( tbuf, makevar( nr, nc ) ), ! 50: strchr( n->def, '=' )); ! 51: n2->def = copystr( tbuf ); ! 52: qadd( &Fixup, n2 ); ! 53: } ! 54: n = n->next; ! 55: } ! 56: } ! 57: } ! 58: ! 59: /* ! 60: * replicate a block of definitions ! 61: */ ! 62: replicate( ar, ac, fr, fc, tr, tc ) ! 63: int ar, ac, fr, fc, tr, tc; ! 64: { ! 65: char tbuf[128], *defin; ! 66: int i, j; ! 67: struct node *n; ! 68: /* ! 69: * Is there a def to be copied ! 70: */ ! 71: n = getnode( ar, ac ); ! 72: if ( n->def == 0 ) { ! 73: (void)sprintf( tbuf, "Not previous definition at %s", ! 74: makevar( ar, ac ) ); ! 75: yyerror( tbuf ); ! 76: lexinit(); ! 77: } ! 78: /* ! 79: * get the definition part ! 80: */ ! 81: defin = strchr( n->def, '=' ); ! 82: if ( defin == 0 ) { ! 83: (void)sprintf( tbuf, "Bug in the definition at %s", ! 84: makevar( ar, ac ) ); ! 85: yyerror( tbuf ); ! 86: lexinit(); ! 87: } ! 88: /* ! 89: * Now make all the copies ! 90: */ ! 91: for ( i=fr; i<=tr; i++ ) { ! 92: for ( j=fc; j<=tc; j++ ) { ! 93: n = getnode( i, j ); ! 94: (void)strcat(strcpy( tbuf, makevar( i, j ) ), defin ); ! 95: n->def = copystr( tbuf ); ! 96: qadd( &Fixup, n ); ! 97: } ! 98: } ! 99: } ! 100: ! 101: /* ! 102: * Convert from a row and column format to a character string ! 103: */ ! 104: char * ! 105: makevar( row, col ) ! 106: int row, col; ! 107: { ! 108: static char buf[16]; ! 109: int i; ! 110: /* ! 111: * and the letters on the vertical ! 112: */ ! 113: i = col / 26; ! 114: if ( i > 0 ) i += 'A' - 1; ! 115: else i = ' '; ! 116: col = col % 26 + 'A'; ! 117: (void)sprintf( buf, "%c%c%d", i, col, row+1 ); ! 118: return( buf ); ! 119: } ! 120: ! 121: /* ! 122: * List the HELP to the Terminal ! 123: */ ! 124: listhelp() ! 125: { ! 126: int cnt; ! 127: char tbuf[128]; ! 128: FILE *fp; ! 129: WINDOW *listwin; ! 130: ! 131: if ( (fp=fopen( HELPFILE, "r" )) == 0 ) { ! 132: (void)sprintf( tbuf, "Cannot open HELPFILE (%s)", HELPFILE ); ! 133: yyerror( tbuf ); ! 134: return; ! 135: } ! 136: listwin = newwin( LINES, COLS, 0, 0 ); ! 137: wmove( listwin, 0, 0 ); ! 138: wclear( listwin ); ! 139: wrefresh( listwin ); ! 140: loop { ! 141: werase( listwin ); ! 142: for( cnt=0; cnt<LINES-2; cnt++ ) { ! 143: if ( fgets( tbuf, 80, fp ) == NULL ) break; ! 144: if( tbuf[0] == '\f' ) break; ! 145: wmove( listwin, cnt, 0 ); ! 146: (void)wprintw( listwin, "%s", tbuf ); ! 147: } ! 148: if ( cnt == 0 ) break; ! 149: wmove( listwin, LINES-2, (COLS-25)/2 ); ! 150: wstandout( listwin ); ! 151: (void)wprintw(listwin,"PRESS <RETURN> WHEN READY"); ! 152: wstandend( listwin ); ! 153: wrefresh( listwin ); ! 154: wgetstr( listwin, tbuf ); ! 155: } ! 156: delwin( listwin ); ! 157: touchwin( stdscr ); ! 158: } ! 159: ! 160: /* ! 161: * edit the definitions file ! 162: */ ! 163: editfile() ! 164: { ! 165: FILE *fp; ! 166: char *file, bfr[128], *editor; ! 167: ! 168: ! 169: clear(); ! 170: move( 0, 25 ); ! 171: standout( ); ! 172: printw( "Entering Editor, Please Wait" ); ! 173: standend( ); ! 174: move( 1, 0 ); ! 175: refresh(); ! 176: file = mktemp("/tmp/visXXXXXX"); ! 177: ! 178: /* ! 179: * Write the definitions out ! 180: */ ! 181: ! 182: refresh(); ! 183: if ( (fp=fopen( file, "w" )) == 0 ) { ! 184: char errbuf[64]; ! 185: (void)sprintf( errbuf, "Cannot open '%s'", file ); ! 186: yyerror( errbuf ); ! 187: lexinit(); ! 188: return; ! 189: } ! 190: ! 191: else dumpfile( fp ); ! 192: ! 193: (void)fclose( fp ); ! 194: ! 195: /* ! 196: * zero out the current definitions ! 197: */ ! 198: ! 199: zerodef(); ! 200: ! 201: /* ! 202: * edit the file ! 203: */ ! 204: ! 205: editor = getenv( "ED" ); ! 206: ! 207: if ( editor == 0 || *editor == '\0' ) ! 208: (void)sprintf( bfr, "ed %s", file ); ! 209: else ! 210: (void)sprintf( bfr, "%s %s", editor, file ); ! 211: ! 212: resetty(); ! 213: (void)system( bfr ); ! 214: noecho(); ! 215: crmode(); ! 216: ! 217: /* ! 218: * clean up the screen ! 219: */ ! 220: ! 221: clear(); ! 222: prheading(); ! 223: refresh(); ! 224: ! 225: /* ! 226: * Read in the new definitions ! 227: */ ! 228: ! 229: if ( (fp=fopen( file, "r" )) == 0 ) { ! 230: char errbuf[64]; ! 231: (void)sprintf( errbuf, "Cannot open '%s'", file ); ! 232: yyerror( errbuf ); ! 233: lexinit(); ! 234: } ! 235: else readfile( fp ); ! 236: (void)unlink( file ); ! 237: } ! 238: ! 239: quit() ! 240: { ! 241: move( LINES-1, 0 ); ! 242: clrtoeol(); ! 243: refresh(); ! 244: endwin(); ! 245: resetty(); ! 246: exit( 0 ); ! 247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.