Annotation of researchv10no/cmd/visi/nodes.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *      nodes.c 1.5
        !             3:  *
        !             4:  *     Node Handling Functions for Spreadsheet Program `vis'
        !             5:  *
        !             6:  *      A. F. Gettier
        !             7:  *      Bell Laboratories
        !             8:  *      Update made 11/3/82 02:08:13
        !             9:  *      Retrieved 11/15/82 13:22:35
        !            10:  */
        !            11: #include       <stdio.h>
        !            12: #include       <math.h>
        !            13: #include       "curses.h"
        !            14: #include       "vis.h"
        !            15: 
        !            16: static struct node     BLANKNODE={-1,-1,UNRES,0,0,0,0,0,0};
        !            17: 
        !            18: extern int     Width;
        !            19: extern int     Scale;
        !            20: extern struct rowhdr   Row;
        !            21: extern struct colhdr   Col;
        !            22: extern struct qheader  Fixup;
        !            23: 
        !            24: /*
        !            25:  *     get a node for reading - returns undef
        !            26:  *         if not present
        !            27:  */
        !            28: struct node *
        !            29: getnode( row, col )
        !            30: int    row, col;
        !            31: {
        !            32:        struct rowlabel **r1;
        !            33:        struct node     *n1, *n2, *n3;
        !            34:        /*
        !            35:         *      Is the row for the new node there?
        !            36:         */
        !            37:        if ( Row.size <= row ) rowexpand( row );
        !            38:        /*
        !            39:         *      Is the col for the new node there?
        !            40:         */
        !            41:        if ( Col.size <= col ) colexpand( col );
        !            42:        /*
        !            43:         *      Get the table addresses
        !            44:         */
        !            45:        r1 = Row.table;
        !            46:        /*
        !            47:         *      Is the node present at the first
        !            48:         *        location?
        !            49:         */
        !            50:        n1 = r1[row]->next;
        !            51:        if ( n1 == 0 || n1->col > col ) {
        !            52:                r1[row]->next = n2 = newnode( row, col );
        !            53:                n2->next = n1;
        !            54:                n2->type = UNDEF;
        !            55:                n2->def = 0;
        !            56:                return( n2 );
        !            57:        }
        !            58:        /*
        !            59:         *      Look Harder!!
        !            60:         */
        !            61:        while ( n1 != 0 && n1->col <= col ) {
        !            62:                if ( n1->col == col ) return( n1 );
        !            63:                n2 = n1;
        !            64:                n1 = n1->next;
        !            65:        }
        !            66:        n3 = newnode( row, col );
        !            67:        n3->next = n1;
        !            68:        n2->next = n3;
        !            69:        n3->type = UNDEF;
        !            70:        n3->def = 0;
        !            71:        return( n3 );
        !            72: }
        !            73: /*
        !            74:  *     Make a new unresolved node
        !            75:  */
        !            76: struct node *
        !            77: newnode( row, col )
        !            78: int    row, col;
        !            79: {
        !            80:        struct node     *n;
        !            81:        n = NODE( node );
        !            82:        n->row = row;
        !            83:        n->col = col;
        !            84:        n->type = UNRES;
        !            85:        n->value = 0;
        !            86:        n->def = 0;
        !            87:        n->svalue = 0;
        !            88:        n->next = 0;
        !            89:        qinit( &(n->depend) );
        !            90:        return( n );
        !            91: }
        !            92: /*
        !            93:  *     mathop - do the math operation type checking, and return a
        !            94:  *         blank node
        !            95:  */
        !            96: struct node
        !            97: mathop( n1, n2 )
        !            98: struct node    *n1, *n2;
        !            99: {
        !           100:        struct node     n;
        !           101:        n = BLANKNODE;
        !           102:        if ( n1->type == NUM && n2->type == NUM ) {
        !           103:                n.type = NUM;
        !           104:        }
        !           105:        else {
        !           106:                if ( n1->row == -1 && n1->type == STRING )
        !           107:                        free( n1->svalue );
        !           108:                if ( n2->row == -1 && n2->type == STRING )
        !           109:                        free( n2->svalue );
        !           110:        }
        !           111:        return( n );
        !           112: }
        !           113: 
        !           114: /*
        !           115:  *     List the definitions to the Terminal
        !           116:  */
        !           117: listfile()
        !           118: {
        !           119:        int     i, cnt;
        !           120:        char    tbuf[128];
        !           121:        struct node     *x;
        !           122:        struct rowlabel **r1;
        !           123:        WINDOW  *listwin;
        !           124:        listwin = newwin( LINES, COLS, 0, 0 );
        !           125:        wmove( listwin, 0, 0 );
        !           126:        wclear( listwin );
        !           127:        wrefresh( listwin );
        !           128:        cnt = 2;
        !           129:        r1 = Row.table;
        !           130:        for ( i=0; i<Row.size; i++ ) {
        !           131:                x = r1[i]->next;
        !           132:                while ( x != 0 ) {
        !           133:                        if ( x->def == 0 ) {
        !           134:                                x = x->next;
        !           135:                                continue;
        !           136:                        }
        !           137:                        (void)wprintw( listwin, "%s\n", x->def );
        !           138:                        x = x->next;
        !           139:                        if ( ++cnt < LINES ) continue;
        !           140:                        cnt = 2;
        !           141:                        wmove( listwin, LINES-2, (COLS-25)/2 );
        !           142:                        wstandout( listwin );
        !           143:                        (void)wprintw(listwin,"PRESS <RETURN> WHEN READY");
        !           144:                        wstandend(listwin);
        !           145:                        wrefresh( listwin );
        !           146:                        wgetstr(  listwin, tbuf );
        !           147:                        werase( listwin );
        !           148:                        wmove( listwin, 0, 0 );
        !           149:                }
        !           150:        }
        !           151:        if ( cnt > 0 ) {
        !           152:                wmove( listwin, LINES-2, (COLS-25)/2 );
        !           153:                wstandout( listwin );
        !           154:                (void)wprintw(listwin,"PRESS <RETURN> WHEN READY");
        !           155:                wstandend(listwin);
        !           156:                wrefresh( listwin );
        !           157:                wgetstr(  listwin, tbuf );
        !           158:        }
        !           159:        delwin( listwin );
        !           160:        touchwin( stdscr );
        !           161: }
        !           162: 
        !           163: /*
        !           164:  *     Dump the definitions to a file
        !           165:  */
        !           166: dumpfile( fp )
        !           167: FILE   *fp;
        !           168: {
        !           169:        int     i;
        !           170:        struct node     *x;
        !           171:        struct rowlabel **r1;
        !           172:        r1 = Row.table;
        !           173:        for ( i=0; i<Row.size; i++ ) {
        !           174:                x = r1[i]->next;
        !           175:                while ( x != 0 ) {
        !           176:                        if ( x->def != 0 )
        !           177:                                (void)fprintf( fp, "%s\n", x->def );
        !           178:                        x = x->next;
        !           179:                }
        !           180:        }
        !           181: }
        !           182: 
        !           183: /*
        !           184:  *     Zero all current the definitions
        !           185:  */
        !           186: zerodef()
        !           187: {
        !           188:        int     i;
        !           189:        struct node     *x, *y;
        !           190:        struct rowlabel **r1;
        !           191:        r1 = Row.table;
        !           192:        for ( i=0; i<Row.size; i++ ) {
        !           193:                x = r1[i]->next;
        !           194:                while ( x != 0 ) {
        !           195:                        if ( x->def != 0 )
        !           196:                                free( x->def );
        !           197:                        if ( x->type == STRING && x->svalue != 0 )
        !           198:                                free( x->svalue );
        !           199:                        y = x;
        !           200:                        x = x->next;
        !           201:                        free( (char *)y );
        !           202:                }
        !           203:                r1[i]->next = 0;
        !           204:        }
        !           205: }
        !           206: 
        !           207: /*
        !           208:  *     Expand the number of defined Rows
        !           209:  */
        !           210: rowexpand( amt )
        !           211: int    amt;
        !           212: {
        !           213:        int     i,j;
        !           214:        struct rowlabel **r1, **r2;
        !           215:        /*
        !           216:         *      check for validity
        !           217:         */
        !           218:        if ( Row.size > amt ) return;
        !           219:        /*
        !           220:         *      Allocate a new Header
        !           221:         */
        !           222:        r1 = Row.table;
        !           223:        i = amt + 1;
        !           224:        r2 = (struct rowlabel **)malloc((unsigned)(i*sizeof(struct rowlabel **)));
        !           225:        for ( j=0; j<Row.size; j++ )
        !           226:                r2[j] = r1[j];
        !           227:        for ( j=Row.size; j<i; j++ ) {
        !           228:                r2[j] = NODE( rowlabel );
        !           229:                r2[j]->rownum = j;
        !           230:                r2[j]->position = 0;
        !           231:                r2[j]->next = 0;
        !           232:        }
        !           233:        free( (char *)r1 );
        !           234:        Row.size = i;
        !           235:        Row.table = r2;
        !           236: }
        !           237: /*
        !           238:  *     Expand the number of defined Cols
        !           239:  */
        !           240: colexpand( amt )
        !           241: int    amt;
        !           242: {
        !           243:        int     i, j;
        !           244:        struct collabel **c1, **c2;
        !           245:        /*
        !           246:         *      check for validity
        !           247:         */
        !           248:        if ( Col.size > amt ) return;
        !           249:        /*
        !           250:         *      Allocate a new Header
        !           251:         */
        !           252:        c1 = Col.table;
        !           253:        i = amt + 1;
        !           254:        c2 = (struct collabel **)malloc((unsigned)(i*sizeof(struct collabel **)));
        !           255:        for ( j=0; j<Col.size; j++ )
        !           256:                c2[j] = c1[j];
        !           257:        for ( j=Col.size; j<i; j++ ) {
        !           258:                c2[j] = NODE( collabel );
        !           259:                c2[j]->position = 0;
        !           260:                c2[j]->cell = -1;
        !           261:                c2[j]->colnum = j;
        !           262:                c2[j]->width = Width;
        !           263:                c2[j]->scale = Scale;
        !           264:        }
        !           265:        free( (char *)c1 );
        !           266:        Col.size = i;
        !           267:        Col.table = c2;
        !           268: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.