/* LMACREAD (GED) -- Text Based Macro Definition Import */ /* LMACREAD (GED) -- Textdatei mit Makrodefinitionen einlesen */ /* // Copyright (c) 2006-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (120123) BUGFIX: // Fixed problem with constant data initialization. // rl (110706) ENHANCEMENT: // Added vertical text center option. // rl (110609) ENHANCEMENT: // Added element comment support. // Added numstr number string formatter. // rl (101019) RELEASED FOR BAE V7.6. // rl (100503) ENHANCEMENT: // Added conditional operator support. // Added value list selection option to macro templates. // rl (100316) ENHANCEMENT: // Added interactive padstack creation support. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (061122) ENHANCEMENT: // Allowed PADDEF command in PADSTACK definition. // rl (060829) RELEASED FOR BAE V6.8. // rl (060728) ORIGINAL CODING. // // DESCRIPTION // // The lmacread User Language program provides generic insertion data // output. The output format is specified in an external script file. // The lmacread User Language program reads pad and padstack definitions // from a selectable ASCII file and automatically creates the therein // defined pads and padstacks. */ // Includes #include "pop.ulh" // User Language popup utilities #include "lay.ulh" // User Language layout utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRINPFILE = M("Makrobeschreibungsdatei ? ", "Macro Description File ? "); string UPRSELTYPE = M("Padstack Template ? ","Padstack Template ? "); string UPRDUNIT = M("Einheiten :","Units :"); string UPRDUNITMM = M("&mm","&mm"); string UPRDUNITMIL = M("mi&l","mi&l"); string UPRPROCMODE = M("Bearbeitungsmodus waehlen!", "Select Process Mode!"); string UPRPROC1 = M("&Konvertierlauf","&Conversion Run"); string UPRPROC2 = M("&Editierlauf","&Edit Run"); string REPADD = M("Hinzugefuegt von: ","Added by:"); string REPDBLSTK = M("Padstack '%s' bereits vorhanden!", "Padstack '%s' already exists!"); string REPDONE = M("Es wurden keine Fehler festgestellt.", "Program run successfully done."); string REPSTKCNT = M("%d Padstackdefinitionen hinzugefuegt.", "%d padstack definitions added."); string ERRPARREF = M("%s Zeile %d: Parameter/Konstante '%s' nicht definiert!", "%s line %d: Parameter/constant '%s' not declared!"); string ERRPLCPOLY = M("Zeile %d: Fehler bei der Polygonerzeugung!", "Line %d: Error generating polygon!"); string ERRPLCPAD = M("Zeile %d: Fehler bei der Padplatzierung ('%s')!", "Line %d: Error placing pad ('%s')!"); string ERRPLCTEXT = M("Zeile %d: Fehler bei der Textplatzierung ('%s')!", "Line %d: Error placing text ('%s')!"); string ERRPLCDRILL = M("Zeile %d: Fehler bei der Bohrungserzeugung!", "Line %d: Error generating drill!"); string ERRSHAPEREF = M("%s Zeile %d: Shape '%s' nicht definiert!", "%s line %d: Shape '%s' not defined!"); string ERRTYPEREF = M("%s Zeile %d: Padstacktyp '%s' nicht definiert!", "%s line %d: Padstack Type '%s' not defined!"); string ERRUNTYPE = M("%s Zeile %d: Padstacktyp '%s' ohne Namenzuweisung!", "%s line %d: Padstack Type '%s' without name assignment!"); string ERRCONSTDUP = M("%s Zeile %d: Konstante '%s' doppelt definiert!", "%s line %d: Double defined constant '%s'!"); string ERRNOTEMP = M("'%s': Keine Padstacktemplates gefunden!", "'%s': No padstack templates found!"); string ERRTYPENAME = M("Padstacktemplate '%s' nicht gefunden!", "Padstack template '%s' not found!"); string ERRBAKFILE = M("Fehler beim Anlegen der Backup-Datei '%s'!", "Error creating backup file '%s'!"); string ERRNOWIN = M("Nur in Windowsumgebungen verfuegbar!", "Windows Environment needed!"); // Parser error messages STRINGS PARSEERRS = { "", M("(synparsefile) Keine BNF-Definition verfuegbar!", "(synparsefile) No BNF definition available!"), M("(synparsefile) Parser ist bereits aktiv!", "(synparsefile) Parser already active!"), M("(synparsefile) Fehler beim Oeffnen der Datei '%s'!", "(synparsefile) Error opening file '%s'!"), M("(synparsefile) Zu viele offene Dateien!", "(synparsefile) Too many open files!"), M("[%s/%d] Fataler Lese-/Schreibfehler!", "[%s/%d] Fatal read/write error!"), M("[%s/%d] Scan Item '%s' zu lang!", "[%s/%d] Scan item '%s' too long!"), M("[%s/%d] Syntaxfehler bei '%s' (unerwartetes Symbol)!", "[%s/%d] Syntax error at '%s' (unexpected symbol)!"), M("[%s/%d] Dateiende erreicht!", "[%s/%d] Unexpected end of file!"), M("[%s/%d] Stackueberlauf (BNF zu komplex)!", "[%s/%d] Stack overflow (BNF too complex)!"), M("[%s/%d] Stackunterlauf (BNF fehlerhaft)!", "[%s/%d] Stack underflow (BNF erroneous)!"), M("[%s/%d] Fehler von Parser Aktion/Funktion!", "[%s/%d] Error from parse action function!"), M("(synparsefile) Unbekannter Fehlercode %d!", "(synparsefile) Unknown error code %d!") }; // INI file parameter name definitions #define PAR_MACDFEXT "MACDFEXT_GED" // Macro definition file name ext. #define PAR_MACDLIB "MACDFILE_GED" // Macro definition file // File transfer definitions string MACDEXT = bae_inistrval(PAR_MACDFEXT,".mac"); // Macro definition file ext. STRINGS extlist = { // Insertion spec. file extensions MACDEXT }; #define MAXLINELEN 1024 // Maximum input line length // Term evaluation definitions #define CMD_CONST 0 // Put constant onto stack #define CMD_PARAM 1 // Put parameter reference onto stack #define CMD_NEG 2 // Negate stack top #define CMD_ADD 3 // Add stack top #define CMD_SUB 4 // Subtract stack top #define CMD_MUL 5 // Multiply stack top #define CMD_DIV 6 // Divide stack top #define CMD_STR 7 // String pattern stack top #define CMD_NUMSTR 8 // String number stack top #define CMD_EQU 9 // Compare equality stack top #define CMD_NEQU 10 // Compare non equality stack top #define CMD_LT 11 // Compare less than stack top #define CMD_LE 12 // Compare less or equal stack top #define CMD_GT 13 // Compare greater than stack top #define CMD_GE 14 // Compare greater or equal stack top #define CMD_COND 15 // Condition command stack top // Rule types #define RUL_NAME 0 // Rule name #define RUL_INT 1 // Rule integer value predicate #define RUL_DBL 2 // Rule double value predicate #define RUL_STR 3 // Rule string value predicate // Reference parameter type definitions #define PARAM_DIM 0 // Dimension parameter #define PARAM_STR 1 // String parameter #define PARAM_DIML 2 // Dimension list parameter #define PARAM_STRL 3 // String list parameter struct datades { // Data descriptor int cmd /* Data code */; int ival /* Data integer value */; double dval /* Data double value */; string sval /* Data string value */; string name /* Data name string */; }; struct datades nilval = { 0,0,0.0,"","" } /* Nil value */; struct datades curterm[] /* Current term command list */; int curtermn = 0 /* Current term command count */; struct refparam { // Reference parameter string name /* Reference parameter name */; int typ /* Reference parameter type */; double dval /* Data double value */; double dvall[] /* Data double value list */; int dvaln /* Data double value count */; string sval /* Data string value */; string svall[] /* Data string value list */; int svaln /* Data string value count */; int pidx /* Data parameter index */; int idx /* Reference parameter dialog item */; }; struct refdes { // Type reference descriptor struct refparam pl[] /* Reference parameter list */; int pn /* Reference paramater count */; int typel[] /* Type reference list */; int typen /* Type reference count */; string el[] /* Type reference new entry list */; int en /* Type reference new entry count */; int line /* Type reference line */; string name /* Type reference name */; } trefl[] /* Type reference list */; int trefn = 0 /* Type reference count */; struct termlist { // Term list descriptor struct datades term[] /* Term command list */; int termn /* Term command count */; }; struct ruledes { struct datades term[] /* Rule term list */; int termn /* Rule term items */; int typ /* Rule type */; string predname /* Optional rule predicate name */; }; struct point { // Point definition struct datades xl[] /* Point x coordinate term list */; int xn /* Point x coordinate term items */; struct datades yl[] /* Point y coordinate term list */; int yn /* Point y coordinate term items */; int typ /* Point type */; } curpointl[] /* Current point list */; int curpointn = 0 /* Current point count */; struct shapedef { // Shape definition string name /* Shape name */; struct point pl[] /* Point list */; int pn /* Point count */; struct termlist vl[] /* Shape variable command list */; int vn /* Shape variable command count */; } shapel[] /* Shape list */; int shapen = 0 /* Shape count */; struct datades constl[] /* Constant value list */; int constn = 0 /* Constant count */; struct termlist curvarl[] /* Current variable list */; int curvarn = 0 /* Current variable count */; struct termlist curparrefl[] /* Current parameter ref. list */; int curparrefn = 0 /* Current parameter ref. count */; struct paddes { // Pad descriptor struct datades name[] /* Pad name commands */; int namen /* Pad name command count */; int layerl[] /* Pad layer list */; int layern /* Pad layer count */; struct point pl[] /* Point list */; int pn /* Point count */; struct datades ang[] /* Pad angle term list */; int angn /* Pad angle term count */; int mirr /* Pad mirror mode */; struct ruledes rules[] /* Pad rule count */; int rulen /* Pad rule count */; } curpad /* Current pad */; struct polydes { // Polygon descriptor int polytyp /* Polygon type */; int polyclose /* Polygon close flag */; int mvis /* Polygon mirror visibility */; int layerl[] /* Polygon layer list */; int layern /* Polygon layer count */; struct point pl[] /* Point list */; int pn /* Point count */; struct termlist sl[] /* Polygon shape param. cmd. list */; int sn /* Polygon shape param. cmd. count */; struct termlist vl[] /* Polygon variable command list */; int vn /* Polygon variable command count */; struct ruledes rules[] /* Polygon rule count */; int rulen /* Polygon rule count */; } curpoly /* Current polygon */; struct textdes { // Text descriptor string text /* Text string */; int layerl[] /* Text layer list */; int layern /* Text layer count */; struct point pl[] /* Point list */; int pn /* Point count */; struct datades ang[] /* Text angle term list */; int angn /* Text angle term count */; struct datades size[] /* Text size term list */; int sizen /* Text size term count */; int mirr /* Text mirror and mode */; struct ruledes rules[] /* Text rule count */; int rulen /* Text rule count */; } curtext /* Current text */; struct drilldes { // Drill descriptor struct point pl[] /* Point list */; int pn /* Point count */; struct datades size[] /* Drill size term list */; int sizen /* Drill size term count */; int class /* Drill class */; struct ruledes rules[] /* Drill rule count */; int rulen /* Drill rule count */; } curdrill /* Current drill */; struct paddefdes { // Pad definition descriptor struct datades name[] /* Pad name commands */; int namen /* Pad name command count */; struct datades comm[] /* Pad comment commands */; int commn /* Pad comment command count */; struct polydes poly /* Pad polygon */; } curpaddef /* Current pad definition */; struct pstktypedef { // Padstack type definition string name /* Type name */; int typename /* Padstack name variable index */; int typecomm /* Padstack comment variable index */; struct point pl[] /* Point list */; int pn /* Point count */; struct textdes tl[] /* Padstack text list */; int tn /* Padstack text count */; struct drilldes dl[] /* Padstack drill list */; int dn /* Padstack drill count */; struct paddes padl[] /* Padstack pad list */; int padn /* Padstack pad count */; struct paddefdes pdl[] /* Padstack pad definition list */; int pdn /* Padstack pad definition count */; struct polydes polyl[] /* Padstack pad list */; int polyn /* Padstack pad count */; struct termlist vl[] /* Type variable command list */; int vn /* Type variable command count */; } typel[] /* Type list */; int typen = 0 /* Type count */; struct datades curparaml[] /* Current parameter list */; int curparamn = 0 /* Current parameter count */; int parambasevl[] = { 0 } /* Parameter base var. index list */; int parambasepl[] = { 0 } /* Par. base par. name index list */; int parambasel[] = { 0 } /* Parameter base index list */; int parambasen = 1 /* Parameter base index count */; int curlayerl[] /* Current layer list */; int curlayern = 0 /* Current layer count */; // Globals #define SMALLVAL 0.000001 // Small distance value string curdfname /* Current defintion file name */; string ddbfname /* Output library file name */; string msg /* Message buffer */; string curname /* Current name */; string curshapename /* Current shape name */; int curtypel[] /* Current type reference list */; int curtypen = 0 /* Current type reference count */; string curpstkname /* Current padstack name */; string curpstkcomm /* Current padstack comment */; string paramnames[] /* Parameter name list */; int paramnamen = 0 /* Parameter count */; struct ruledes currules[] /* Current rule name list */; int currulen = 0 /* Current rule count */; string curpred /* Current predicate name */; int curconstref /* Current constant reference index */; double curval /* Current value */; double curconv /* Current conversion factor */; struct datades curpadname[] /* Current pad name term list */; int curpadnamen /* Current pad name term count */; struct datades curpadcomm[] /* Current pad comment term list */; int curpadcommn /* Current pad comment term count */; struct datades cursize[] /* Current size term list */; int cursizen /* Current size term count */; struct datades curang[] /* Current angle term list */; int curangn /* Current angle term count */; int curmirr /* Current mirror mode */; int curmode /* Current text mode */; int curclass /* Current drill class */; int curmclass = 0 /* Current drill class mirror flag */; int curpolytyp /* Current polygon type */; int curpolymvis /* Current polygon mirror visibility */; int curplcmode = 1 /* Current placement mode */; int curprocmode = 0 /* Current process mode */; // Main program void main() { string macdfname /* Macro defintion file name */; string trefname /* Type reference name */; int trefidx /* Type reference index */; int typeidx /* Type index */; int typerep = 1 /* Type loop repeat flag */; int pstkrep /* Padstack loop repeat flag */; int paramrep /* Parameter report flag */; int paramidx /* Parameter index */; string paramstr /* Parameter string */; double pcol /* Parameter column */; double elen /* Edit field length */; double cy = DIAL_TOPMARG /* Current y value */; double len /* Text length */; int cunits /* Coordinate display units */; int en = 0 /* New entry count */; int sfh /* Source file handle */; int dfh /* Destination file handle */; string sbuf /* String buffer */; string bakfname /* Backup file name */; string hostname /* Host name */; string username /* User name */; int sec,min,hour /* Time values */; int day,month,year /* Date values */; int weekday,yearday /* Day values */; int curline /* Current replacement line */; int nextline /* Next replacement line */; int oldparamn /* Old parameter count */; string indent /* Line indent string */; char c /* Character buffer */; int i, j /* Loop control variables */; // Select the element mode bae_promptdialog(UPRPROCMODE); if ((curprocmode=bae_askmenu(3,UPRPROC1,UPRPROC2,UPRABORT))<0 || curprocmode>1) // Abort error_abort(); if ((macdfname=bae_inistrval(PAR_MACDLIB,""))=="") // Select the macro definition input file if ((macdfname=askfile(UPRINPFILE,extlist,0))=="") error_abort(); if (curprocmode) { // Check if dialog box support if (bae_dialclr()) error(ERRNOWIN); // Perform BAE Demo check with abort BAE_Demo_check(2); } // Build the output library file name ddbfname=convstring(macdfname,0)+DDBEXT; // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Parse the macro definition file parsefile(macdfname); if (curprocmode==0) { // Done bae_prtdialog(REPDONE); exit(0); } if (trefn==0) errormsg(ERRNOTEMP,macdfname); curprocmode=0; do { bae_nameclr(); for (i=0;i=trefn) errormsg(ERRTYPENAME,trefname); pcol=10.0; elen=11.0; for (i=0;ipcol) pcol=len; if (trefl[trefidx].pl[i].typ==PARAM_STRL) for (j=0;jelen) elen=len; } pcol+=1.0; elen+=1.0; pstkrep=1; do { bae_dialclr(); cunits= bae_getcoorddisp() ? 2 : 0; // Init. the y coordinate cy=DIAL_TOPMARG; for (i=0;i=trefn ? (-1) : trefl[trefidx].line; } } // Close files fclose(sfh); fclose(dfh); fseterrmode(1); // Done sprintf(msg,REPSTKCNT,en); bae_prtdialog(msg); } /*________________________________________________________________*/ // Scanner/parser functions /*________________________________________________________________*/ #bnf { // LMACREAD BNF input syntax definition COMMENT ("/*","*/") ; COMMENT ("//") ; macdfile : sections EOF ; sections : sections section | section ; section : constant | range | shapes | pads | padstacktypes | padstacks | includefile | EOFINC | ; constant : "CONST" name (p_constname) constval ";" ; constval : constnum (p_constval) | singlelayerdef (p_constlay) | drillclass (p_constdrl) | conststring (p_conststring) ; range : "RANGE" name (p_constname) constval ";" ; shapes : "SHAPES" "{" (p_listclear) shapedefs "}" ; shapedefs : shapedefs shapedef | shapedef | ; shapedef : name (p_shapestart) "(" paramdeflist ")" "{" vardefs pointlist (p_polyend) "}" (p_shapeend) ; paramdeflist : paramdef "," paramdeflist | paramdef ; paramdef : name (p_paramname) | ; vardefs : vardefs varassignment | varassignment | ; varassignment : name (p_varname) "=" cond (p_varvalue) ";" ; pointlist : pointlist point | point ; point : "POINT" xycoord (p_ptyp(0)) ";" | "ARCLEFT" xycoord (p_ptyp(1)) ";" | "ARCRIGHT" xycoord (p_ptyp(2)) ";" | "NEW" (p_ptyp(3)) optnmvis ";" ; xycoord : "(" cond (p_xcoord) "," cond (p_ycoord) ")" ; pads : "PADS" "{" (p_listclear) paddefs "}" ; paddefs : paddefs paddef | paddef | ; paddef : padheader paddefcmds shapeorpoly (p_storepad) ; paddefcmds : paddefcmds paddefcmd | paddefcmd ; paddefcmd : layerlist | ; padheader : cond (p_padstart) optpadcomment ; optpadcomment : "," cond (p_padcomment) | ; shapeorpoly : shaperef | polydef ; shaperef : shapetype name (p_shaperefstart) "(" paramlist ")" optrules ";" (p_shaperefend) ; polydef : polytype "{" pointlist (p_polyend) "}" (p_storepoly) ; refparamlist : refparamlist "," refparam | refparam ; refparam : refparamtype DQSTR (p_refparamname) | constnum (p_dimentry(1)) | conststring (p_strentry(1)) ; refparamtype : "dim" (p_refparamtype(0)) | "string" (p_refparamtype(1)) | "dimlist" (p_refparamtype(2)) "{" dimlist "}" | "stringlist" (p_refparamtype(3)) "{" strlist "}" ; dimlist : dimlist "," dimentry | dimentry ; dimentry : constnum (p_dimentry(0)) ; strlist : strlist "," strentry | strentry ; strentry : conststring (p_strentry(0)) ; paramlist : paramlist "," param | param ; param : cond (p_param) | ; padstacktypes : "PADSTACKTYPES" "{" pstktdefs "}" ; pstktdefs : pstktdefs pstktdef | pstktdef | ; pstktdef : IDENT (p_typestart) "(" paramdeflist ")" "{" vardefs (p_typevars) typdefs "}" (p_typeend) ; typdefs : typdefs typdef | typdef | ; typdef : "PADREF" cond (p_padref) padcmds (p_padrefend) ";" | "PADDEF" padheader paddefcmds shapeorpoly (p_storepad) | "TEXT" DQSTR (p_textstart) size textcmds (p_storetext) ";" | "DRILL" (p_drillstart) size drlcmds (p_storedrill) ";" | "POLYGON" polycmds shapeorpoly (p_plcpoly) ; padstacks : "PADSTACKS" "{" (p_listclear) pstkdefs "}" ; pstkdefs : pstkdefs pstkdef | pstkdef | ; pstkdef : cond (p_pstkstart) optpstkcomment "{" pstkcmds "}" (p_pstkend) | IDENT (p_typerefname) typeparamlists ";" (p_typeclear) | "[" typereflist "]" typeparamlists ";" (p_typeclear) | "QUERY" DQSTR (p_pstktemp) ":" IDENT (p_typerefname) "(" (p_reftypes) refparamlist ")" (p_pstktend) ";" | "QUERY" DQSTR (p_pstktemp) ":" "[" typereflist "]" "(" (p_reftypes) refparamlist ")" (p_pstktend) ";" ; optpstkcomment : "," cond (p_pstkcomment) | ; typereflist : typereflist "," typeref | typeref ; typeref : IDENT (p_typerefname) ; typeparamlists : typeparamlists "," typeparamlist | typeparamlist ; typeparamlist : "(" (p_typerefstart) paramlist ")" (p_typerefend) ; pstkcmds : pstkcmds pstkcmd | pstkcmd ; pstkcmd : "PADDEF" padheader paddefcmds shapeorpoly (p_storepad) | "PADREF" cond (p_padref) padcmds (p_padrefend) ";" | "TEXT" DQSTR (p_textstart) size textcmds (p_storetext) ";" | "DRILL" (p_drillstart) size drlcmds (p_storedrill) ";" | "POLYGON" (p_listclear) polycmds shapeorpoly (p_plcpoly) ; padcmds : padcmds padcmd | padcmd ; padcmd : xycoord (p_ptyp(0)) | layerlist | angle | mirror | rules | ; drlcmds : drlcmds drlcmd | drlcmd ; drlcmd : xycoord (p_ptyp(0)) | drillclassspec | rules | ; textcmds : textcmds textcmd | textcmd ; textcmd : xycoord (p_ptyp(0)) | layerlist | "CENTER" (p_texthcenter) | "HCENTER" (p_texthcenter) | "VCENTER" (p_textvcenter) | angle | mirror | rules | ; polycmds : polycmds polycmd | polycmd ; polycmd : layerlist | rules | ; mirror : "MIRROR" (p_mirror) ; shapetype : "SHAPE" polytype ; polytype : polybtype optpolymvis ; polybtype : "FILLED" (p_polytyp(0)) | "KEEPOUT" (p_polytyp(1)) | "LINE" (p_polytyp(2)) | "CLOSEDLINE" (p_polytyp(3)) ; optpolymvis : "TOP" (p_polymvis(1)) | "BOTTOM" (p_polymvis(2)) | ; optnmvis : "TOP" (p_paddmvis(4)) | "BOTTOM" (p_paddmvis(8)) | ; drillclassspec : drillclass | IDENT (p_classref) ; drillclass : drillbaseclass | drillbaseclass "MIRROR" (p_mirrclass) drillbaseclass ; drillbaseclass : "-" (p_class(0)) | "A" (p_class(1)) | "B" (p_class(2)) | "C" (p_class(3)) | "D" (p_class(4)) | "E" (p_class(5)) | "F" (p_class(6)) | "G" (p_class(7)) | "H" (p_class(8)) | "I" (p_class(9)) | "J" (p_class(10)) | "K" (p_class(11)) | "L" (p_class(12)) | "M" (p_class(13)) | "N" (p_class(14)) | "O" (p_class(15)) | "P" (p_class(16)) | "Q" (p_class(17)) | "R" (p_class(18)) | "S" (p_class(19)) | "T" (p_class(20)) | "U" (p_class(21)) | "V" (p_class(22)) | "W" (p_class(23)) | "X" (p_class(24)) | "Y" (p_class(25)) | "Z" (p_class(26)) ; rules : "RULES" (p_initrule) "(" rulelist ")" ; optrules : rules | ; rulelist : rulelist "," ruledef | ruledef | ; ruledef : cond (p_rulename) | "INT" predname "=" cond (p_predval(1)) | "DBL" predname "=" cond (p_predval(2)) | "DIM" predname "=" cond (p_predval(2)) | "STR" predname "=" cond (p_predval(3)) ; predname : IDENT (p_predname) ; layerlist : layerlist "," layerdef | layerdef ; layerdef : singlelayerdef | "SIG" NUMBER (p_layer) "," siglayerlist ; siglayerlist : siglayerlist "," NUMBER (p_layer) | NUMBER (p_layer) ; singlelayerdef : "SIG" NUMBER (p_layer) | "ALL" (p_alllayer) | "INNER" (p_innerlayer) | "TOP" (p_toplayer) | "DOC" NUMBER (p_doclayer) docside | IDENT (p_layref) ; docside : "BOTTOM" (p_docside(0)) | "TOP" (p_docside(1)) | "BOTH" (p_docside(2)) ; size : cond (p_size) ; angle : "ANGLE" cond (p_angle) ; cond : equality | equality "?" cond ":" cond (p_cond) ; equality : comparison | equality "==" comparison (p_equal) | equality "!=" comparison (p_nequal) ; comparison : sum | comparison "<" sum (p_lt) | comparison "<=" sum (p_le) | comparison ">" sum (p_gt) | comparison ">=" sum (p_ge) ; sum : product | sum "+" product (p_add) | sum "-" product (p_sub) ; product : unary | product "*" unary (p_mul) | product "/" unary (p_div) ; unary : primary | "-" unary (p_neg) ; primary : IDENT (p_ref) | constnum (p_constpush) | conststring (p_sconstpush) | "(" sum ")" | "str" "(" sum "," sum "," conststring (p_sconstpush) ")" (p_str) | "numstr" "(" sum "," sum "," sum ")" (p_numstr) ; constnum : NUMBER (p_val) optconvfac ; conststring : SQSTR (p_name) | DQSTR (p_name) ; optconvfac : "mm" (p_mm) | "cm" (p_cm) | "Inch" (p_inch) | "Zoll" (p_inch) | "mil" (p_mil) | NUMBER (p_conv) | ; name : IDENT (p_name) | SQSTR (p_name) | DQSTR (p_name) ; includefile : "#" (p_eolnflag(1)) "include" DQSTR (p_include) EOLN (p_eolnflag(0)) ; } // BNF syntax definition end /*________________________________________________________________*/ void parsefile(string fn) /* // Parse an input file // Parameter : // string fn : File name */ { int status /* Parser status */; // Parse the input file and evaluate the parser status synscaneoln(0); synsetintpar(0,1); curdfname=fn; if ((status=synparsefile(fn))==0) { // No error synsetintpar(0,0); return; } synsetintpar(0,0); if (status>=arylength(PARSEERRS)) sprintf(msg,PARSEERRS[arylength(PARSEERRS)-1],status); else sprintf(msg,PARSEERRS[status],fn,synscanline(),synscanstring()); // Print the error message error(msg); } // Parser action routines int p_include() /* // Handle the include file request // Return value : // zero if done or (-1) on error */ { string ofn /* Old parse file name */; string fn /* Include file name */; int status /* Parser status */; synscaneoln(0); // Parse the input file and evaluate the parser status ofn=curdfname; curdfname=fn=synscanstring(); if ((status=synparseincfile(fn))!=0) { synsetintpar(0,0); if (status>=arylength(PARSEERRS)) sprintf(msg,PARSEERRS[arylength(PARSEERRS)-1],status); else sprintf(msg,PARSEERRS[status], fn,synscanline(),synscanstring()); // Print the error message error(msg); } curdfname=ofn; // Return without errors return(0); } int p_eolnflag(int flag) /* // Handle the end of line store request // Return value : // zero if done or (-1) on error // Parameters : // int flag : End of line flag */ { synscaneoln(flag); // Return without errors return(0); } int p_name() /* // Handle the name string store request // Return value : // zero if done or (-1) on error */ { curname=synscanstring(); // Return without errors return(0); } int p_predname() /* // Handle the predicate name store request // Return value : // zero if done or (-1) on error */ { curpred=synscanstring(); // Return without errors return(0); } int p_initrule() /* // Handle the rule list init. request // Return value : // zero if done or (-1) on error */ { currulen=0; // Return without errors return(0); } int p_rulename() /* // Handle the rule name store request // Return value : // zero if done or (-1) on error */ { currules[currulen].term=curterm; currules[currulen].termn=curtermn; currules[currulen].typ=RUL_NAME; currules[currulen].predname=""; currulen++; curtermn=0; // Return without errors return(0); } int p_predval(int typ) /* // Handle the integer value store request // Return value : // zero if done or (-1) on error // Parameter : // int typ : Predicate type */ { currules[currulen].term=curterm; currules[currulen].termn=curtermn; currules[currulen].typ=typ; currules[currulen].predname=curpred; currulen++; curtermn=0; // Return without errors return(0); } int p_size() /* // Handle the size store request // Return value : // zero if done or (-1) on error */ { cursize=curterm; cursizen=curtermn; curtermn=0; // Return without errors return(0); } int p_angle() /* // Handle the angle store request // Return value : // zero if done or (-1) on error */ { curang=curterm; curangn=curtermn; curtermn=0; // Return without errors return(0); } int p_mirror() /* // Handle the mirror flag store request // Return value : // zero if done or (-1) on error */ { curmirr=1; // Return without errors return(0); } int p_texthcenter() /* // Handle the text horizontal center fag store request // Return value : // zero if done or (-1) on error */ { curmode|=TEXTHCENT; // Return without errors return(0); } int p_textvcenter() /* // Handle the text vertical center fag store request // Return value : // zero if done or (-1) on error */ { curmode|=TEXTVCENT; // Return without errors return(0); } int p_constname() /* // Handle the constant name store request // Return value : // zero if done or (-1) on error */ { int i /* Loop control variable */; for (i=0;i=shapen) { // Shape not found sprintf(msg,ERRSHAPEREF,curdfname,synscanline(),curshapename); bae_msgbox(2,msg,""); exit(0); } // Get the polygon type switch (curpolytyp) { // Filled area case 0 : polytyp=L_POLYCOPPASS; polyclose=0; break; // Keepout area case 1 : polytyp=L_POLYKEEPOUT; polyclose=0; break; // Closed documentary line case 3 : polytyp=L_POLYDOCLINE; polyclose=1; break; // Documentary line case 2 : default : polytyp=L_POLYDOCLINE; polyclose=0; } // Store the polygon curpoly.polytyp=polytyp; curpoly.polyclose=polyclose; curpoly.pl=shapel[shapeidx].pl; curpoly.pn=shapel[shapeidx].pn; curpoly.vl=shapel[shapeidx].vl; curpoly.vn=shapel[shapeidx].vn; curpoly.sl=curparrefl; curpoly.sn=curparrefn; curpoly.layerl=curlayerl; curpoly.layern=curlayern; curpoly.mvis=0; curpoly.rules=currules; curpoly.rulen=currulen; curpointn=currulen=curtermn=curparrefn=curlayern=0; return(0); } int p_typestart() /* // Handle the type name store request // Return value : // zero if done or (-1) on error */ { typel[typen].name=synscanstring(); typel[typen].typename=(-1); typel[typen].typecomm=(-1); typel[typen].tn=0; typel[typen].pn=0; typel[typen].dn=0; typel[typen].padn=0; typel[typen].pdn=0; typel[typen].polyn=0; pushparam(); curpointn=curtermn=0; curplcmode=0; // Return without errors return(0); } int p_typevars() /* // Handle the type name store request // Return value : // zero if done or (-1) on error */ { int vn = 0 /* Variable count */; int i /* Loop control variable */; for (i=parambasepl[parambasen-1];i0) curpointl[curpointn-1].typ|=mvis; // Return without errors return(0); } int p_val() /* // Receive a value specification // Return value : // zero if done or (-1) on error */ { string valstr /* Value string */; int len /* Value string length */; // Get the value string valstr=synscanstring(); strlower(valstr); curval=atof(valstr); curconv=1.0; len=strlen(valstr); // Check for trailing unit designators if (len>4 && ((valstr[len-4]=='z' && valstr[len-3]=='o' && valstr[len-2]=='l' && valstr[len-1]=='l') || (valstr[len-4]=='i' && valstr[len-3]=='n' && valstr[len-2]=='c' && valstr[len-1]=='h'))) return(p_inch()); if (len>3 && valstr[len-3]=='m' && valstr[len-2]=='i' && valstr[len-1]=='l') return(p_mil()); if (len>2) { if (valstr[len-2]=='c' && valstr[len-1]=='m') return(p_cm()); if (valstr[len-2]=='m' && valstr[len-1]=='m') return(p_mm()); } // Return without errors return(0); } int p_mm() /* // Receive a mm conversion factor // Return value : // zero if done or (-1) on error */ { curconv=1000.0; // Return without errors return(0); } int p_cm() /* // Receive a cm conversion factor // Return value : // zero if done or (-1) on error */ { curconv=100.0; // Return without errors return(0); } int p_inch() /* // Receive an inch conversion factor // Return value : // zero if done or (-1) on error */ { curconv=1.0/0.0254; // Return without errors return(0); } int p_mil() /* // Receive a mil conversion factor // Return value : // zero if done or (-1) on error */ { curconv=1.0/0.0000254; // Return without errors return(0); } int p_conv() /* // Receive a conversion factor // Return value : // zero if done or (-1) on error */ { curconv=atof(synscanstring()); // Return without errors return(0); } void storetermcmd(int cmd,int ival,double dval,string sval) /* // Store expression stack command // Parameters : // int cmd : Term command // int ival : Term integer value // double dval : Term double value // string sval : Term string value */ { curterm[curtermn].cmd=cmd; curterm[curtermn].ival=ival; curterm[curtermn].dval=dval; curterm[curtermn].sval=sval; curterm[curtermn].name=""; curtermn++; } struct datades evalexpr(struct datades terml[],int termn) /* // Evaluate expression term // Return value : // evaluation result // Parameters : // struct datades terml[] : Term item list // int termn : Term item count */ { struct datades exprstk[] /* Expression stack */; struct datades retval /* Return value */; int ival /* Integer value */; double dval /* Double value */; string sval /* String value */; int exprstkn = 0 /* Expression stack pointer */; int i /* Loop control variable */; // Execute all term commands for (i=0;iSMALLVAL ? 1 : 0 ; } else { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].ival!= exprstk[exprstkn].ival ? 1 : 0 ; } exprstk[exprstkn-1].dval=0.0; exprstk[exprstkn-1].sval=""; break; case CMD_LT : if (exprstkn<=1) break; exprstkn--; if (exprstk[exprstkn-1].sval!="" || exprstk[exprstkn].sval!="") { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].sval< exprstk[exprstkn].sval ? 1 : 0 ; } else if (exprstk[exprstkn-1].dval!=0.0 || exprstk[exprstkn].dval!=0.0) { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].dval< (exprstk[exprstkn].dval-SMALLVAL) ? 1 : 0 ; } else { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].ival< exprstk[exprstkn].ival ? 1 : 0 ; } exprstk[exprstkn-1].dval=0.0; exprstk[exprstkn-1].sval=""; break; case CMD_LE : if (exprstkn<=1) break; exprstkn--; if (exprstk[exprstkn-1].sval!="" || exprstk[exprstkn].sval!="") { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].sval<= exprstk[exprstkn].sval ? 1 : 0 ; } else if (exprstk[exprstkn-1].dval!=0.0 || exprstk[exprstkn].dval!=0.0) { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].dval<= (exprstk[exprstkn].dval+SMALLVAL) ? 1 : 0 ; } else { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].ival<= exprstk[exprstkn].ival ? 1 : 0 ; } exprstk[exprstkn-1].dval=0.0; exprstk[exprstkn-1].sval=""; break; case CMD_GT : if (exprstkn<=1) break; exprstkn--; if (exprstk[exprstkn-1].sval!="" || exprstk[exprstkn].sval!="") { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].sval> exprstk[exprstkn].sval ? 1 : 0 ; } else if (exprstk[exprstkn-1].dval!=0.0 || exprstk[exprstkn].dval!=0.0) { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].dval> (exprstk[exprstkn].dval+SMALLVAL) ? 1 : 0 ; } else { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].ival> exprstk[exprstkn].ival ? 1 : 0 ; } exprstk[exprstkn-1].dval=0.0; exprstk[exprstkn-1].sval=""; break; case CMD_GE : if (exprstkn<=1) break; exprstkn--; if (exprstk[exprstkn-1].sval!="" || exprstk[exprstkn].sval!="") { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].sval>= exprstk[exprstkn].sval ? 1 : 0 ; } else if (exprstk[exprstkn-1].dval!=0.0 || exprstk[exprstkn].dval!=0.0) { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].dval>= (exprstk[exprstkn].dval-SMALLVAL) ? 1 : 0 ; } else { exprstk[exprstkn-1].ival= exprstk[exprstkn-1].ival>= exprstk[exprstkn].ival ? 1 : 0 ; } exprstk[exprstkn-1].dval=0.0; exprstk[exprstkn-1].sval=""; break; case CMD_COND : if (exprstkn<=2) break; exprstkn-=2; if (exprstk[exprstkn-1].ival) exprstk[exprstkn-1]=exprstk[exprstkn]; else exprstk[exprstkn-1]=exprstk[exprstkn+1]; } } // Return expression result if (exprstkn==1) retval=exprstk[0]; else retval=nilval; return(retval); } STRINGS evalrules(struct ruledes rulel[],int rulen) /* // Evaluate expression term // Return value : // evaluation result // Parameters : // struct datades terml[] : Term item list // int termn : Term item count */ { struct datades res /* Result buffer */; string resl[] ={""} /* Rule return name list */; char c /* Current character */; int curbit /* Current bit value */; int i, j /* Loop control variables */; // Evaluate all rules for (i=0;i0) { // Get the X coordinate res=evalexpr(curpad.pl[0].xl,curpad.pl[0].xn); x=res.dval; // Get the Y coordinate res=evalexpr(curpad.pl[0].yl,curpad.pl[0].yn); y=res.dval; } else { x=y=0.0; } if (curpad.angn>0) { res=evalexpr(curpad.ang,curpad.angn); ang=cvtangle(res.dval,1,0); } else { ang=0.0; } // Store pad(s) for (i=0;i0 && lay_lastfigelem(fig)==0 && lay_rulefigatt(fig,evalrules(curpad.rules,curpad.rulen))) rs_error(-1); } } void placepoly() /* // Place the current polygon */ { index L_FIGURE fig /* Figure list index */; struct datades res /* Result buffer */; double x, y /* Point coordinates */; double x1, y1 /* First point coordinates */; int i1 = 1 /* First point index */; int mvis = curpoly.mvis /* Polygon mirror visibility */; int baseoff /* Shape reference base offset */; int i, j /* Loop control variables */; // Get the text layers curlayerl=curpoly.layerl; curlayern=curpoly.layern; curpointl=curpoly.pl; curpointn=curpoly.pn; // Check if standard layer if (curlayern==0) { curlayerl[0]=0; curlayern=1; } if (curpoly.sn) { baseoff=curparamn; // Store the polygon parameters for (i=0;i=3) { // Check if last polygon flush if (i!=0) { // Close shape if (curpoly.polyclose) bae_storepoint(x1,y1,0); // Store polygon(s) for (j=0;j=DOCLAYBASE) ? L_POLYDOCAREA : curpoly.polytyp, "",mvis)) { sprintf(msg,ERRPLCPOLY, synscanline()); error(msg); } // Attach rule(s) if (curpoly.rulen>0 && lay_lastfigelem(fig)==0 && lay_rulefigatt(fig,evalrules( curpoly.rules,curpoly.rulen))) rs_error(-1); } } bae_clearpoints(); if (curpointl[i].typ&8) mvis=2; else if (curpointl[i].typ&4) mvis=1; else mvis=curpoly.mvis; i1=i+1; continue; } // Get the X coordinate res=evalexpr(curpointl[i].xl,curpointl[i].xn); x=res.dval; // Get the Y coordinate res=evalexpr(curpointl[i].yl,curpointl[i].yn); y=res.dval; // Store the point bae_storepoint(x,y,curpointl[i].typ); if (i==i1) { x1=x; y1=y; } } if (curpoly.sn) popparam(); } void placetext() /* // Place the current text */ { index L_FIGURE fig /* Figure list index */; struct datades res /* Result buffer */; double x, y /* Text coordinates */; double ang /* Text angle */; double size /* Text size */; int i /* Loop control variable */; // Get the text layers curlayerl=curtext.layerl; curlayern=curtext.layern; // Check if standard layer if (curlayern==0) { curlayerl[0]=0; curlayern=1; } if (curtext.pn>0) { // Get the X coordinate res=evalexpr(curtext.pl[0].xl,curtext.pl[0].xn); x=res.dval; // Get the Y coordinate res=evalexpr(curtext.pl[0].yl,curtext.pl[0].yn); y=res.dval; } else { // Assume origin text x=y=0.0; } // Get text placement angle if (curtext.angn>0) { res=evalexpr(curtext.ang,curtext.angn); ang=cvtangle(res.dval,1,0); } else { // Assume horizontal text ang=0.0; } // Get text height res=evalexpr(curtext.size,curtext.sizen); size=res.dval; // Store text(s) for (i=0;i0 && lay_lastfigelem(fig)==0 && lay_rulefigatt(fig,evalrules(curtext.rules,curtext.rulen))) rs_error(-1); } } void placedrill() /* // Place the current drill */ { index L_FIGURE fig /* Figure list index */; struct datades res /* Result buffer */; double x, y /* Text coordinates */; double size /* Text size */; if (curdrill.pn>0) { // Get the X coordinate res=evalexpr(curdrill.pl[0].xl,curdrill.pl[0].xn); x=res.dval; // Get the Y coordinate res=evalexpr(curdrill.pl[0].yl,curdrill.pl[0].yn); y=res.dval; } else { x=y=0.0; } res=evalexpr(curdrill.size,curdrill.sizen); size=res.dval; // Store drill if (ged_storedrill(x,y,size*0.5,curdrill.class)) { sprintf(msg,ERRPLCDRILL,synscanline()); error(msg); } // Attach rule(s) if (curdrill.rulen>0 && lay_lastfigelem(fig)==0 && lay_rulefigatt(fig,evalrules(curdrill.rules,curdrill.rulen))) rs_error(-1); } void pushparam() /* // Push current parameter count on parameter base stack */ { parambasel[parambasen]=curparamn; parambasevl[parambasen]=curvarn; parambasepl[parambasen]=paramnamen; parambasen++; } void popparam() /* // Pop current parameter count from parameter base stack */ { parambasen--; curparamn=parambasel[parambasen]; curvarn=parambasevl[parambasen]; paramnamen=parambasepl[parambasen]; } // User Language program end