Annotation of 42BSD/usr.bin/struct/tree.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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