Annotation of 41BSD/cmd/struct/tree.c, revision 1.1.1.1

1.1       root        1: # include "y.tab.h"
                      2: #include "b.h"
                      3: #include <stdio.h>
                      4: 
                      5: 
                      6: addroot(string,type,n1,n2)
                      7: char *string;
                      8: int type;
                      9: struct node *n1, *n2;
                     10:        {
                     11:        struct node *p;
                     12:        p = malloc(sizeof(*p));
                     13:        p->left = n1;
                     14:        p->right = n2;
                     15:        p->op = type;
                     16:        p->lit = malloc(slength(string) + 1);
                     17:        str_copy(string,p->lit,slength(string) + 1);
                     18:        return(p);
                     19:        }
                     20: 
                     21: 
                     22: freetree(tree)
                     23: struct node *tree;
                     24:        {
                     25:        if (tree)
                     26:                {freetree(tree->left);
                     27:                freetree(tree->right);
                     28:                freenode(tree);
                     29:                }
                     30:        }
                     31: 
                     32: freenode(treenode)
                     33: struct node *treenode;
                     34:        {
                     35:        free(treenode->lit);
                     36:        free(treenode);
                     37:        }
                     38: 
                     39: int compop[]   {       '&',    '|',    '<',    '>',    xxeq,   xxle,   xxne,   xxge};
                     40: int notop[]    {       '|',    '&',    xxge,   xxle,   xxne,   '>',    xxeq,   '<'};
                     41: char *opstring[]       { "||",  "&&",  ">=",   "<=", "!=",     ">",    "==",   "<"};
                     42: 
                     43: checkneg(tree,neg)             /* eliminate nots if possible */
                     44: struct node *tree;
                     45: int neg;
                     46:        {
                     47:        int i;
                     48:        struct node *t;
                     49:        if (!tree) return(0);
                     50:        for (i =  0; i < 8; ++i)
                     51:                if (tree->op == compop[i]) break;
                     52:        if (i > 1 && i <  8 && tree ->left ->op == '-' && str_eq(tree->right->lit,"0"))
                     53:                {
                     54:                t = tree->right;
                     55:                tree->right = tree->left->right;
                     56:                freenode(t);
                     57:                t = tree->left;
                     58:                tree->left = tree->left->left;
                     59:                freenode(t);
                     60:                }
                     61: 
                     62: 
                     63:        if (neg)
                     64:                {
                     65:                if (tree ->op == '!')
                     66:                        {
                     67:                        t = tree->left;
                     68:                        freenode(tree);
                     69:                        return(checkneg(t,0));
                     70:                        }
                     71:                        if (i < 8)
                     72:                                {
                     73:                                tree->op = notop[i];
                     74:                                free(tree->lit);
                     75:                                tree->lit = malloc(slength(opstring[i])+1);
                     76:                                str_copy(opstring[i],tree->lit, slength(opstring[i])+1);
                     77:                                if (tree->op == '&' || tree->op == '|')
                     78:                                        {
                     79:                                        tree->left = checkneg(tree->left,1);
                     80:                                        tree->right = checkneg(tree->right,1);
                     81:                                        }
                     82:                                return(tree);
                     83:                                }
                     84:                if (tree->op == xxident && str_eq(tree->lit,".false."))
                     85:                        str_copy(".true.",tree->lit, slength(".true.")+1);
                     86:                else if (tree->op == xxident && str_eq(tree->lit,".true."))
                     87:                        {
                     88:                        free(tree->lit);
                     89:                        tree->lit = malloc(slength(".false.")+1);
                     90:                        str_copy(".false.",tree->lit, slength(".false.")+1);
                     91:                        }
                     92:                else
                     93:                        {
                     94:                        tree = addroot("!",'!',tree,0);
                     95:                        tree->lit = malloc(2);
                     96:                        str_copy("!",tree->lit, slength("!")+1);
                     97:                        }
                     98:                return(tree);
                     99:                }
                    100:        else
                    101:                if (tree->op == '!')
                    102:                        {
                    103:                        t = tree;
                    104:                        tree = tree->left;
                    105:                        freenode(t);
                    106:                        return(checkneg(tree,1));
                    107:                        }
                    108:        else
                    109:                {tree->left = checkneg(tree->left,0);
                    110:                tree->right = checkneg(tree->right,0);
                    111:                return(tree);
                    112:                }
                    113:        }
                    114: 
                    115: yield(tree,fprec)
                    116: struct node *tree;
                    117: int fprec;                             /* fprec is precedence of father of this node */
                    118:        {
                    119:        int paren,p;
                    120:        static int oplast;                      /* oplast = 1 iff last char printed was operator */
                    121:        if (!tree) return;
                    122:        p = prec(tree ->op);
                    123:        paren = (p < fprec || (oplast && tree->op == xxuminus)) ? 1 : 0;
                    124: 
                    125:        if (paren)
                    126:                {
                    127:                putout('(',"(");
                    128:                oplast = 0;
                    129:                }
                    130: 
                    131:        switch(tree->op)
                    132:                {
                    133:                case xxuminus:
                    134:                        tree->op = '-';
                    135:                case '!':
                    136:                        putout(tree->op,tree->lit);
                    137:                        oplast = 1;
                    138:                        yield(tree->left,p);
                    139:                        break;
                    140:                case '&':
                    141:                case '|':
                    142:                case '<':
                    143:                case '>':
                    144:                case xxeq:
                    145:                case xxle:
                    146:                case xxge:
                    147:                case '+':
                    148:                case '-':
                    149:                case '*':
                    150:                case '/':
                    151:                case '^':
                    152:                        yield(tree->left,p);
                    153:                        putout(tree->op, tree->lit);
                    154:                        oplast = 1;
                    155:                        yield(tree->right,p);
                    156:                        break;
                    157:                case xxidpar:
                    158:                        yield(tree->left,0);
                    159:                        putout('(',"(");
                    160:                        oplast = 0;
                    161:                        yield(tree->right,0);
                    162:                        putout('(',")");
                    163:                        oplast = 0;
                    164:                        break;
                    165:                default:
                    166:                        yield(tree->left,p);
                    167:                        putout(tree->op, tree->lit);
                    168:                        oplast = 0;
                    169:                        yield(tree->right,p);
                    170:                        break;
                    171:                }
                    172:        if (paren)
                    173:                {
                    174:                putout(')',")");
                    175:                oplast = 0;
                    176:                }
                    177:        }
                    178: 
                    179: puttree(tree)
                    180: struct node *tree;
                    181:        {
                    182:        yield(tree,0);
                    183:        freetree(tree);
                    184:        }
                    185: 
                    186: 
                    187: prec(oper)
                    188: int oper;
                    189:        {
                    190:        switch(oper)
                    191:                {
                    192:                case ',':               return(0);
                    193:                case '|':       return(1);
                    194:                case '&':       return(2);
                    195:                case '!':       return(3);
                    196: 
                    197:                case '<':               case '>':               case xxeq:
                    198:                case xxne:      case xxle:      case xxge:
                    199:                                return(4);
                    200:                case '+':
                    201:        case '-':               return(5);
                    202:                case '*':
                    203:        case '/':               return(6);
                    204:                case xxuminus:  return(7);
                    205:                case '^':       return(8);
                    206:                default:        return(9);
                    207:                }
                    208:        }
                    209: str_copy(s,ptr,length) /* copy s at ptr, return length of s */
                    210: char *s, *ptr;
                    211: int length;
                    212:        {int i;
                    213:        for (i = 0; i < length; i++)
                    214:                {
                    215:                ptr[i] = s[i];
                    216:                if (ptr[i] == '\0')
                    217:                        return(i + 1);
                    218:                }
                    219:        fprintf(2,"string %s too long to be copied by str_copy at address %d\n",
                    220:                        *s,ptr);
                    221:        exit(1);
                    222:        }
                    223: str_eq(s,t)
                    224: char s[],t[];
                    225:        {int j;
                    226:        for (j = 0; s[j] == t[j]; j++)
                    227:                {if (s[j] == '\0') return(1);}
                    228:        return(0);
                    229:        }
                    230: 
                    231: slength(s)                     /* return number of chars in s, not counting '\0' */
                    232: char *s;
                    233:        {
                    234:        int i;
                    235:        if (!s) return(-1);
                    236:        for (i = 0; s[i] != '\0'; i++);
                    237:        return(i);
                    238:        }

unix.superglobalmegacorp.com

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