Annotation of researchv10no/cmd/struct/tree.c, revision 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.