Annotation of 41BSD/cmd/cifplot/make.c, revision 1.1.1.1

1.1       root        1: /*******************************************************************
                      2: *                                                                  *
                      3: *    File: CIFPLOT/make.c                                          *
                      4: *    Written by Dan Fitzpatrick                                    *
                      5: *    copyright 1980 -- Regents of the University of California     *
                      6: *                                                                  *
                      7: ********************************************************************/
                      8: 
                      9: #include <stdio.h>
                     10: #include "defs.h"
                     11: #include "globals.h"
                     12: #include "parser_defs.h"
                     13: #include "structs.h"
                     14: #include "alloc.h"
                     15: 
                     16: IMPORT Command *FindSymbol();
                     17: IMPORT Command *alloc();
                     18: IMPORT Command *palloc();
                     19: IMPORT struct LCell *FindLayer();
                     20: IMPORT Free();
                     21: IMPORT State();
                     22: IMPORT CopyDelete();
                     23: IMPORT Error();
                     24: IMPORT ZeroBBox();
                     25: IMPORT CompBBox();
                     26: IMPORT CompPtBBox();
                     27: IMPORT MakeBBox();
                     28: IMPORT transform *MakeTransform();
                     29: IMPORT char *Concat();
                     30: 
                     31: extern Command *MakeComment(); /* Forward Reference */
                     32: 
                     33: Command *
                     34: MakePoly(p)
                     35: struct PathHeader *p;
                     36: {
                     37:     Command *command;
                     38:        command = GetCommand();
                     39:        command->type = POLYGON;
                     40:        command->Ctype.Path = p->PHead;
                     41:        Free(p);
                     42:        command->CLink = NIL;
                     43:        MakeBBox(&(command->CBBox),command);
                     44:        return(command);
                     45:    }
                     46: 
                     47: Command *
                     48: MakeBox(length,width,center,direct)
                     49: real length,width;
                     50: point *center,*direct;
                     51: {
                     52:     Command *command;
                     53:     command = GetCommand();
                     54:     command->type = BOX;
                     55:     command->CLink = NIL;
                     56:     command->Ctype.Box.blength = length;
                     57:     command->Ctype.Box.bwidth = width;
                     58:     command->Ctype.Box.bcenter.x = center->x;
                     59:     command->Ctype.Box.bcenter.y = center->y;
                     60:     CheckPoint(direct);
                     61:     command->Ctype.Box.bdirect.x = direct->x;
                     62:     command->Ctype.Box.bdirect.y = direct->y;
                     63:     MakeBBox(&(command->CBBox),command);
                     64:     return(command);
                     65:     }
                     66: 
                     67: CheckPoint(pt)
                     68: point *pt;
                     69: {
                     70:     if( (pt->x == 0.0) && (pt->y == 0.0) ) {
                     71:        pt->x = 1.0;
                     72:        return(0);
                     73:        }
                     74:     return(1);
                     75:     }
                     76: 
                     77: Command *
                     78: MakeFlash(dia,center)
                     79: real dia;
                     80: point *center;
                     81: {
                     82:     Command *command;
                     83:     command = GetCommand();
                     84:     command->type = FLASH;
                     85:     command->CLink = NIL;
                     86:     command->Ctype.Flash.fdia = dia;
                     87:     command->Ctype.Flash.fcenter.x = center->x;
                     88:     command->Ctype.Flash.fcenter.y = center->y;
                     89:     MakeBBox(&(command->CBBox),command);
                     90:     return(command);
                     91:     }
                     92: 
                     93: Command *
                     94: MakeWire(width,p)
                     95: real width;
                     96: struct PathHeader *p;
                     97: {
                     98:     Command *command;
                     99:     command = GetCommand();
                    100:     command->type = WIRE;
                    101:     ZeroBBox(&(command->CBBox));
                    102:     command->CLink = NIL;
                    103:     command->Ctype.Wire.WWidth = width;
                    104:     command->Ctype.Wire.WPath = p->PHead;
                    105:     command->Ctype.Wire.WIns = NIL;
                    106:     Free(p);
                    107:     MakeBBox(&(command->CBBox),command);
                    108:     return(command);
                    109:     }
                    110: 
                    111: Command *
                    112: MakeSymbol(num,a,b)
                    113: int num,a,b;
                    114: {
                    115:     Command *command,*p;
                    116:     struct CCell *q;
                    117:     char s[128];
                    118: 
                    119:     switch(State(num)){
                    120:        case USED:
                    121:        case UNUSED:
                    122:                sprintf(s,"Symbol %d redefined",num);
                    123:                Error(s,WARNING);
                    124:                p = FindSymbol(num);
                    125:                p->Ctype.Symbl.status = DELETED;
                    126:                if(p->Ctype.Symbl.backTrace != NIL)
                    127:                        Error("Dangling References after Symbol Redefintion",WARNING);
                    128:                for(q=p->Ctype.Symbl.backTrace; q!=NIL; q=q->CCLink)
                    129:                        CopyDelete(q->CCCom);
                    130:                /* Fall through and create new symbol */
                    131:        case DELETED:
                    132:        case NONEXIST:
                    133:                command = GetCommand();
                    134:                command->type = SYMBOL;
                    135:                command->Ctype.Symbl.SymNo = num;
                    136:                command->Ctype.Symbl.backTrace = NIL;
                    137:                command->Ctype.Symbl.status = UNUSED;
                    138:                command->Ctype.Symbl.a = a;
                    139:                command->Ctype.Symbl.b = b;
                    140:                command->Ctype.Symbl.CStart = NIL;
                    141:                command->Ctype.Symbl.CFinnish = NIL;
                    142:                command->Ctype.Symbl.SName = Concat("",0);
                    143:                command->CLink = NIL;
                    144:                command->level = -1;
                    145:                ZeroBBox(&(command->CBBox));
                    146:                return(command);
                    147:        case UNDEFINED:
                    148:                command = FindSymbol(num);
                    149:                command->Ctype.Symbl.status = UNEXAMINED;
                    150:                command->Ctype.Symbl.a = a;
                    151:                command->Ctype.Symbl.b = b;
                    152:                return(command);
                    153:        default:
                    154:          {     char s[128];
                    155:                sprintf(s,"Symbol %d in unknown state\n",num);
                    156:                Error(s,INTERNAL);
                    157:                }
                    158:        }
                    159:     }
                    160: 
                    161: Command *
                    162: AddCmd(h,c)
                    163: Command *h;
                    164: Command *c;
                    165: {
                    166:     Command *p;
                    167: 
                    168:     switch(c->type) {
                    169:        case COMMENT:
                    170:                FreeCommand(c);
                    171:                return(h);
                    172:        case NAME:
                    173:                if(*(h->Ctype.Symbl.SName) != '\0') {
                    174:                        char s[256],*msg;
                    175:                        sprintf(s,"Symbol %d has already been named ",
                    176:                                        h->Ctype.Symbl.SymNo);
                    177:                        msg = Concat(s,h->Ctype.Symbl.SName,0);
                    178:                        Error(msg,WARNING);
                    179:                        Free(msg);
                    180:                        h->Ctype.Symbl.SName = Concat(h->Ctype.Symbl.SName,
                    181:                                                "--",c->Ctype.s,0);
                    182:                        FreeCommand(c);
                    183:                        return(h);
                    184:                        }
                    185:                h->Ctype.Symbl.SName = c->Ctype.s;
                    186:                FreeCommand(c);
                    187:                return(h);
                    188:        case LAYER:
                    189:                h->level = c->level;
                    190:                FreeCommand(c);
                    191:                return(h);
                    192:        case WIRE:
                    193:        case POLYGON:
                    194:        case BOX:
                    195:        case FLASH:
                    196:                /* Check for valid layer description */
                    197:                if(h->level == -1) {
                    198:                    Error("Layer not Specified",RECOVERABLE);
                    199:                    h->level = 0;
                    200:                    }
                    201:        case POINTNAME:
                    202:        case TEXT:
                    203:        case CALL:
                    204:        case ARRAY:
                    205:                /* Add new command to end of command list */
                    206:                if (h->Ctype.Symbl.CStart == NIL)
                    207:                        h->Ctype.Symbl.CFinnish = h->Ctype.Symbl.CStart = c;
                    208:                    else {
                    209:                        h->Ctype.Symbl.CFinnish->CLink = c;
                    210:                        h->Ctype.Symbl.CFinnish = c;
                    211:                        }
                    212:                /* New Command may itself be a list (i.e. a wire) */
                    213:                for(p=c; p!=NIL; p= p->CLink) {
                    214:                    h->Ctype.Symbl.CFinnish = p;
                    215:                    /* Set to current level */
                    216:                    p->level = h->level;
                    217:                    }
                    218:                return(h);
                    219:        default:
                    220:           {    char s[128];
                    221:                sprintf(s,"Unknown Command in Defintion of Symbol %d\n",
                    222:                                        h->Ctype.Symbl.SymNo);
                    223:                Error(s,INTERNAL);
                    224:                }
                    225:        }
                    226:     }
                    227: 
                    228: Command *
                    229: MakeCall(num,trans)
                    230: int num;
                    231: transform *trans;
                    232: {
                    233:     Command *command;
                    234:     command = GetCommand();
                    235:     command->type = CALL;
                    236:     command->Ctype.Call.CallNo = num;
                    237:     command->Ctype.Call.trans = trans;
                    238:     command->Ctype.Call.CSymb = NIL;
                    239:     ZeroBBox(&(command->CBBox));
                    240:     command->CLink = NIL;
                    241:     return(command);
                    242:     }
                    243: 
                    244: Command *
                    245: MakeComment()
                    246: {
                    247:     Command *command;
                    248:     command = GetCommand();
                    249:     command->type = COMMENT;
                    250:     ZeroBBox(&(command->CBBox));
                    251:     command->CLink = NIL;
                    252:     return(command);
                    253:     }
                    254: 
                    255: struct PathHeader *
                    256: MakePath(pt)
                    257: point *pt;
                    258: {
                    259:     PointList *path;
                    260:     struct PathHeader *PH;
                    261: 
                    262:     path = (PointList *) alloc(sizeof(PointList));
                    263:     PH = (struct PathHeader *) alloc(sizeof(struct PathHeader));
                    264:     PH->PNo = 1;
                    265:     PH->PHead = PH->PTail = path;
                    266:     path->PLink = NIL;
                    267:     path->pt.x = pt->x;
                    268:     path->pt.y = pt->y;
                    269:     return(PH);
                    270:     }
                    271: 
                    272: struct PathHeader *
                    273: AddPath(PH,pt)
                    274: struct PathHeader *PH;
                    275: point *pt;
                    276: {
                    277:     PointList *newpath;
                    278: 
                    279:     newpath = (PointList *) alloc(sizeof(PointList));
                    280:     (PH->PNo)++;
                    281:     PH->PTail->PLink = newpath;
                    282:     PH->PTail = newpath;
                    283:     newpath->PLink = NIL;
                    284:     newpath->pt.x = pt->x;
                    285:     newpath->pt.y = pt->y;
                    286:     return(PH);
                    287:     }
                    288: 
                    289: 
                    290: point *
                    291: MakePoint(x,y)
                    292: real x,y;
                    293: {
                    294:     point *p;
                    295:     p = (point *) alloc(sizeof(point));
                    296:     p->x = x;
                    297:     p->y = y;
                    298:     return(p);
                    299:     }
                    300: 
                    301: Command *
                    302: MakeArray(s,m,n,dx,dy)
                    303: int s,m,n;
                    304: real dx,dy;
                    305: {
                    306:     Command *command;
                    307:     transform *t;
                    308: 
                    309:     command = GetCommand();
                    310:     command->type = ARRAY;
                    311:     ZeroBBox(&(command->CBBox));
                    312:     command->CLink = NIL;
                    313:     t = MakeTransform();
                    314:     command->Ctype.Array.ACom = MakeCall(s,t);
                    315:     command->Ctype.Array.As = s;
                    316:     command->Ctype.Array.Am = m;
                    317:     command->Ctype.Array.An = n;
                    318:     command->Ctype.Array.Adx = dx;
                    319:     command->Ctype.Array.Ady = dy;
                    320:     return(command);
                    321:     }
                    322: 
                    323: Command *
                    324: MakePointName(s,pt,label)
                    325: char *s,*label;
                    326: point *pt;
                    327: {
                    328:     Command *command;
                    329:     command = GetCommand();
                    330:     command->type = POINTNAME;
                    331:     command->Ctype.PointName.Name = s;
                    332:     command->Ctype.PointName.loc.x = pt->x;
                    333:     command->Ctype.PointName.loc.y = pt->y;
                    334:     command->Ctype.PointName.Label = label;
                    335:     if(strcmp(label,"all") == 0)
                    336:        command->level = -1;
                    337:       else {
                    338:        struct LCell *p;
                    339:        if((p=FindLayer(label)) == NIL) {
                    340:            Error("Unknown layer",RECOVERABLE);
                    341:            command->level = -1;
                    342:            }
                    343:          else
                    344:            command->level = p->LNum;
                    345:        }
                    346:     MakeBBox(&(command->CBBox),command);
                    347:     return(command);
                    348:     }
                    349: 
                    350: Command *
                    351: MakeName(s)
                    352: char *s;
                    353: {
                    354:     Command *command;
                    355:     command = GetCommand();
                    356:     command->type = NAME;
                    357:     ZeroBBox(&(command->CBBox));
                    358:     command->CLink = NIL;
                    359:     command->Ctype.s = s;
                    360:     return(command);
                    361:     }
                    362: 
                    363: Command *
                    364: MakeText(s,t,c)
                    365: char *s;
                    366: transform *t;
                    367: char c;
                    368: {
                    369:     Command *command;
                    370:     command = GetCommand();
                    371:     command->type = TEXT;
                    372:     command->Ctype.Text.TString = s;
                    373:     command->Ctype.Text.TTrans = t;
                    374:     command->Ctype.Text.TLoc = c;
                    375:     ZeroBBox(&(command->CBBox));
                    376:     command->CLink = NIL;
                    377:     return(command);
                    378:     }

unix.superglobalmegacorp.com

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