/* SLIBUTIL (SCM) -- SCM Library Management */ /* SLIBUTIL (SCM) -- SCM-Bibliotheksmanagement */ /* -- INTENDED FOR KEY-CALL USE -- */ /* // Copyright (c) 1994-2012 Oliver Bartels F+E, Muenchen // Author: Manfred Baumeister // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (110714) ENHANCEMENT: // Added logical definition project tree deletion function. // rl (110303) ENHANCEMENT: // Added unreferenced element marker function to deletion box. // rl (110221) ENHANCEMENT: // Added library element check function. // rl (101019) RELEASED FOR BAE V7.6. // rl (091027) RELEASED FOR BAE V7.4. // rl (090806) ENHANCEMENT: // Added name pattern report functions. // rl (081209) ENHANCEMENT: // Added element comment list edit function. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (030904) RELEASED FOR BAE V6.2. // rl (021209) RELEASED FOR BAE V6.0. // rl (020621) RELEASED FOR BAE V5.4. // rl (020621) ENHANCEMENT: // Added rule delete function. // rl (020207) BUGFIX: // Fixed problem with alternate color database file name // specified by environment variable BAE_SCMLIB. // rl (010625) RELEASED FOR BAE V5.0. // rl (010330) BUGFIX: // Fixed problem with disfunctional part delete option. // rl (010229) ENHANCEMENT: // Added optional parameter settings from bae.ini file. // Added reference cross check to avoid deletion of // referenced file elements. // rl (000821) RELEASED FOR BAE V4.6. // rl (000821) ENHANCEMENT: // Definition file export function introduced. // mb (000723) CHANGE: // Delete Elements function to display deleted elements count. // mb (000723) CHANGE: // Adapted to new popupmulmenu function definition. // rl (000712) ENHANCEMENT: // Element delete function introduced. // rl (000221) ENHANCEMENT: // Element copy function introduced. // rl (990625) RELEASED FOR BAE V4.4. // rl (980910) RELEASED FOR BAE V4.2. // mb (980710) ENHANCEMENT: // Pulldown menu delimiters introduced. // mb (980710) ENHANCEMENT: // Dynamic multi-language support introduced. // rl (970929) RELEASED FOR BAE V4.0. // mb (960919) RELEASED FOR BAE V3.4. // mb (95) RELEASED FOR BAE V3.2. // mb (950102) ENHANCEMENT: // Option for SLIBCOMP call introduced. // mb (94) RELEASED FOR BAE V3.0. // mb (94) ORIGINAL CODING. // // DESCRIPTION // // The slibutil User Language program provides a menu with // a series of advanced SCM library management utilities // such as producing library cross references, generating // library documentation, performing library consistency // checks, copying or deleting menu-selectable DDB file // elements, activating library edit batches, etc. */ // Enforce SCM caller type #pragma ULCALLERSCM // Disable undo state request #pragma ULCALLERNOUNDO // Includes #include "baeparam.ulh" // User Language BAE param. access #include "pop.ulh" // User Language popup utilities // Messages string UPRABORT = M_UPRABORT(); string UPRFCT = M("SCM-Librarymanagement-Funktion waehlen!", "Select SCM Library Management Function!"); string UPRFCT1 = M("&List DDB","&List DDB"); string UPRFCT2 = M("Library-&Inhalt","Library &Contents"); string UPRFCT3 = M("Library-&Cross-Referenz","Library Cross &Reference"); string UPRFCT4 = M("Library-&Dokukumentation","Library &Documentation"); string UPRFCT5 = M("Library-&News","Library &News"); string UPRFCT6 = M("Library-&Vergleich","Library Co&mpare"); string UPRFCT7 = M("%Elemente &kopieren","%Co&py Elements"); string UPRFCT8 = M("Elemente l&oeschen","Delete Elemen&ts"); string UPRFCT9 = M("Symbol Edit &Batch","Symbol Edit &Batch"); string UPRFCT10 = M("%Definitionsinfo E&xport","%E&xport Definitions Info"); string UPRFCT11 = M("Definitions&pruefung","C&heck Definitions"); string UPRFCT12 = M("%&Regeln Export","%Export R&ules"); string UPRFCT13 = M("%&Elementkommentare","%&Element Comments"); string UPRFCT14 = M("%Namens&muster Report","%N&ame Pattern Report"); string UPRFCT15 = M("%Biblio&thekscheck","%Library Chec&k"); string UPRFILE = M("Dateiname ? ","File Name ? "); string UPRSELELEM = M("Elementname/-muster ? ","Element Name/Pattern ? "); string UPRSELCLASS = M("Elementklasse selektieren!", "Select Element Class!"); string UPRCLSCM = M("&Plan","S&heet"); string UPRCLSPLST = M("&Bauteilattribute","Pa&rt Attributes"); #define UPRCLSSYM "&Symbol" #define UPRCLSLAB "&Label" #define UPRCLSMRK "&Marker" string UPRCLPCON = M("%&Netzliste","%&Netlist"); string UPRCLCPRT = M("La&youtbauteilnamen","La&yout Part Names"); string UPRCLLLIB = M("Lo&gische Bibliothek","Lo&gical Library"); string UPRCLSCOL = M("%&Farben","%&Color"); string UPRCLRULE = M("%&Regeln","%&Rules"); string UPRDFILE = M("!Zieldateiname ? ","!Destination File Name ? "); string UPRLFILE = M("Quelldateiname ? ","Source File Name ? "); string UPRELEMCOMM = M("Elementkommentare","Element Comments"); string UPRNEXTDIAL = M("&Weitere","&Next"); string UPRPREVDIAL = M("&Vorherige","&Previous"); string UPRDPATTERN = M("Muster anwenden","Apply Pattern"); string UPRDUNREF = M("Markieren Unreferenzierte","Mark Unreferenced"); string UPRUPDLIB = M("Update Bibliothek","Update Library"); string UPRTOGGLEWAR = M("%d Elemente selektiert, %d Elemente deselektiert!", "%d Elements selected, %d Elements deselected!"); string UPRFEXISTS = M("Ausgabedatei '%s' existiert bereits. Ueberschreiben ?", "Output file '%s' already exits. Overwrite ?"); string UPRSELDMOD = M("Loeschmodus selektieren!","Select Delete Mode!"); string UPRDMOD0 = M("DDB-&Einzeldatei","&Single DDB File"); string UPRDMOD1 = M("Projekt&verzeichnisbaum","Project File &Tree"); string UPRPDIR = M("Projektverzeichnis ? ","Project Directory ? "); string UPRSELREPM = M("Reporttyp selektieren!","Select Report Type!"); string UPRREPM0 = M("Report &Namensmuster","Report Name &Patterns"); string UPRREPM1 = M("Report &Symbole","Report &Symbols"); string UPRSELDDB = M("SCM-Bibliotheksdatei ? ","SCM Library File ? "); string UPRPATLIST = M("Namensmuster in '%s':","Name Patterns in '%s':"); string UPRSPATLIST = M("Symbolnamensmuster in '%s':", "Symbol Name Patterns in '%s':"); string UPRDELCONF = M("Alle gelisteten Elemente loeschen ?", "Name Patterns all listes elements?"); string REPSOURCE = M("Elementklasse '%s', Datei '%s'", "Element class '%s', File '%s'"); string REPELEMREF = M("%s '%s' wird von %s '%s' referenziert.", "%s '%s' referenced by %s '%s'."); string REPDELDONE = M("%d Element(e) aus der DDB-Datei '%s' geloescht.", "%d element(s) deleted from DDB file '%s'."); string REPDELHD1 = M("%d Element(e) nicht geloescht, da referenziert:", "%d referenced element(s) not deleted:"); string REPDEFDONE = M("%d Definitionen in Datei '%s' geschrieben.", "%d Definitions written to file '%s'."); string REPDELTDONE = M("%d Element(e) in Projektverzeichnis '%s' geloescht.", "%d element(s) in project folder '%s' deleted."); string REPDELTHD1 = M("%d Element(e) konnten nicht geloescht werden:", "%d element(s) could not be deleted:"); string REPRULDONE = M("%d Regeln in Datei '%s' geschrieben.", "%d Rules written to file '%s'."); string REPPATTERN = M("%-*s : %dx, z.B. %s","%-*s : %dx, e.g. %s"); string REPSYMPATT = M("%-*s : %s","%-*s : %s"); string REPLIBCOMP = M("Bibliothekselementvergleich", "Library Element Comparion"); string REPPRJHEAD = M("Projektdatei '%s'","Project file '%s'"); string REPLIBHEAD = M("Bibliotheksdatei '%s'","Library file '%s'"); string REPLIBOK = M("Standardbibliothek '%s' enthaelt keine neueren Makros.", "No newer macros in standard library '%s' found."); string REPLIBDIFFL = M("%s (%s) neuer in Bibliothek:", "%s (%s) newer in library:"); string REPLIBDIFFP = M("%s (%s) neuer in Projekt:", "%s (%s) newer in project:"); string REPPRJENT = M(" Projekt (%02d.%02d.%04d / %02d:%02d:%02d)", " Project (%02d.%02d.%04d / %02d:%02d:%02d)"); string REPLIBENT = M(" Bibliothek (%02d.%02d.%04d / %02d:%02d:%02d)", " Library (%02d.%02d.%04d / %02d:%02d:%02d)"); string REPELEMHD = M("Zu Name/Muster '%s' in '%s' gefundene Elemente :", "Elements Matching Name/Pattern '%s' in '%s' :"); string ERRDELETE = M("Fehler beim Loeschen von Element '%s'!", "Error deleting element '%s'!"); string ERRDELCOMM = M("Fehler beim Ruecksetzen des Elementkommentars von '%s'!", "Error resetting element comment for '%s'!"); string ERRSETCOMM = M("Fehler beim Setzen des Elementkommentars von '%s'!", "Error setting element comment for '%s'!"); string ERRNOWIN = M("Nur in Windowsumgebungen verfuegbar!", "Windows Environment needed!"); // INI file parameter name definitions #define PAR_DEFFEXT "DEFFEXT_SCM" // Definition file name extension #define PAR_LINELEN "LLCOLS_SCM" // Logical library edit columns #define PAR_RULFEXT "RULFEXT_SCM" // Rule file name extension #define PAR_LISTDCNT "MACRODCNT_STD" // Max. dialog list items count // Global User Language program variables #define UL_LISTDDB "listddb" // ULP: List DDB #define UL_LIBCONTS "libconts" // ULP: Library Contents #define UL_LIBCRREF "libcrref" // ULP: Library Cross Reference #define UL_SLIBDOC "slibdoc" // ULP: SCM Library Documentation #define UL_SLIBNEWS "slibnews" // ULP: SCM Library News #define UL_SLIBCOMP "slibcomp" // ULP: SCM Library Compare #define UL_SYMEDBAT "symedbat" // ULP: SCM Symbol Edit Batch #define UL_COPYELEM "copyelem" // ULP: Copy elements #define UL_CLOGDEFS "clogdefs" // ULP: Check Logical Definitions // Globals string DEFEXT = bae_inistrval(PAR_DEFFEXT,".def") /* Definition file name extension */; int LINELEN = bae_iniintval(PAR_LINELEN,40); // Logical library edit columns string RULEXT = bae_inistrval(PAR_RULFEXT,".rul") /* Definition file name extension */; int MAXMENULINE = bae_iniintval(PAR_LISTDCNT,12) /* Max. menu list length */; #define DBUTW 6.5 // Dialog box button width #define DBUTSPC 8.5 // Dialog box button hor. spacing #define MAXHLINE 8 // Max. header lines #define MINLHEIGHT 2.0 // Min. list box height // Global variables STRINGS selentryl /* Selected entry string list */; int selentryn = 0 /* Selected entry count */; STRINGS refentryl /* Referenced entry string list */; int refentryn = 0 /* Referenced entry count */; STRINGS reffilel /* Referenced entry file list */; // Main program void main() { // Abort if not in SCM if (uliptype()!=ULIPSCM) error_class(); // Ask for library management function bae_promptdialog(UPRFCT); switch (bae_askmenu(16,UPRFCT1,UPRFCT2,UPRFCT3,UPRFCT4,UPRFCT5,UPRFCT6, UPRFCT7,UPRFCT8,UPRFCT9,UPRFCT10,UPRFCT11,UPRFCT12,UPRFCT13,UPRFCT14, (bae_planddbclass()==DDBCLUNDEF ? "," : "")+UPRFCT15,UPRABORT)) { // List DDB case 0 : runulprogexit(UL_LISTDDB); // Library Contents case 1 : runulprogexit(UL_LIBCONTS); // Library Cross Reference case 2 : runulprogexit(UL_LIBCRREF); // SCM Library Documentation case 3 : runulprogexit(UL_SLIBDOC); // SCM Library News case 4 : runulprogexit(UL_SLIBNEWS); // SCM Library Compare case 5 : runulprogexit(UL_SLIBCOMP); // Element copy case 6 : runulprogexit(UL_COPYELEM); // Element delete case 7 : delelements(); break; // SCM Symbol Edit Batch case 8 : runulprogexit(UL_SYMEDBAT); // Definition file export case 9 : defexport(); break; // Logical definitions check case 10 : runulprogexit(UL_CLOGDEFS); // Rule source file export case 11 : ruleexport(); break; // Element comments case 12 : elementcomments(); break; // Name pattern report case 13 : patternreport(); break; // Library check case 14 : libcheck(); break; // Abort on default default : } } // Delete elements void delelements() { STRINGS headl /* Header string list */; int headn /* Header string count */; STRINGS entryl /* Entry string list */; int entryn = 0 /* Entry list */; string ename /* Element name buffer */; string fn /* File name */; int planddbcl = bae_planddbclass() /* Current plan DDB class */; int ddbcl = DDBCLUNDEF /* Plan DDB class */; int i /* Loop control variable */; // Select the SCM DDB class bae_promptdialog(UPRSELCLASS); switch (bae_askmenu(11,UPRCLSCM,UPRCLSPLST,UPRCLSSYM,UPRCLSLAB, UPRCLSMRK,UPRCLPCON,UPRCLCPRT,UPRCLLLIB,UPRCLSCOL,UPRCLRULE, UPRABORT)) { /* Plan */ case 0 : ddbcl=DDBCLSCM; break; /* Part */ case 1 : ddbcl=(-DDBCLSPLST); break; /* Symbol */ case 2 : ddbcl=DDBCLSSYM; break; /* Label */ case 3 : ddbcl=DDBCLSLAB; break; /* Marker */ case 4 : ddbcl=DDBCLSMRK; break; /* Netlist */case 5 : ddbcl=(-DDBCLPCON); break; /* Lay.Prt.*/case 6 : ddbcl=(-DDBCLCPRT); break; /* Log.Lib.*/case 7 : // Select the delete mode bae_promptdialog(UPRSELDMOD); switch (bae_askmenu(3,UPRDMOD0,UPRDMOD1,UPRABORT)) { /* Single DDB file */ case 0 : ddbcl=DDBCLLLIB; break; /* Project file tree */ case 1 : delelemtree(DDBCLLLIB); exit(0); } break; /* Color */ case 8 : ddbcl=DDBCLSCOL; break; /* Rule */ case 9 : ddbcl=DDBCLRULE; break; } // Check the element class if (ddbcl==DDBCLUNDEF) // Abort error_abort(); // Get the file name if (ddbcl==DDBCLSCOL) { // Get the color table name fn=strgetconffilename(SCMLIBVNAME,SCMLIBNAME,1); } else { // Select the DDB file if (bae_askddbfname(fn,1,UPRFILE)) // Abort error_abort(); if (((ddbcl==DDBCLSSYM || ddbcl==DDBCLSLAB) && planddbcl==DDBCLSCM) || (ddbcl==DDBCLSMRK && (planddbcl==DDBCLSCM || planddbcl==DDBCLSSYM || planddbcl==DDBCLSLAB))) verifysave(); } // Scan all elements ename=""; while (scanddbenames(fn,abs(ddbcl),ename)==1) { entryl[entryn]=ename; entryn++; } // Build the popup menu header sprintf(headl[0],REPSOURCE,ddbclassname(abs(ddbcl)),fn); headn=1; // Show the multiple selection menu bae_setintpar(16,3051); popupselmulelem(UPRSELELEM,headl,headn,entryl,entryn,fn,ddbcl, headn+entryn+2,selentryl,selentryn); // Check for referenced elements switch (ddbcl) { // Schematic symbol/label case DDBCLSSYM : case DDBCLSLAB : refcheck(fn,DDBCLSCM,ddbcl); break; // Schematic marker case DDBCLSMRK : refcheck(fn,DDBCLSCM,ddbcl); refcheck(fn,DDBCLSSYM,ddbcl); refcheck(fn,DDBCLSLAB,ddbcl); break; // Rule case DDBCLRULE : refcheck(fn,DDBCLLAY,ddbcl); refcheck(fn,DDBCLLPRT,ddbcl); refcheck(fn,DDBCLSCM,ddbcl); refcheck(fn,DDBCLSSYM,ddbcl); break; } // Deleted all selected elements for (i=0;ixmax) eboxw=xmax; // Init. the selection state field for (i=0;i=0) { // Try to load previously used box size bae_setintpar(16,id); if (bae_getdblpar(8,dialwidth)==0) { // Use last selected box width eboxw=dialwidth-DIAL_LEFTMARG-DIAL_RIGHTSMARG; // Get buffered height bae_getdblpar(9,dialheight); lastboxflag=1; } else { lastboxflag=0; } } cy=DIAL_TOPMARG; bae_getdblpar(1,orgymax); if (lastboxflag) bae_setdblpar(1,1000.0); bae_getdblpar(1,ymax); bae_setdblpar(1,orgymax); ymax-=0.2+DIAL_SEPVSTEP; // Check if small header display if (mheadnymax) eboxh=ymax; // Set min. box height if (eboxh=MAXHLINE) bae_dialadvcontrol(PA_STR|PA_NOEDIT|PA_FNTFIX,0,0,0, 0.0,0.0,0.0,headstr,2*strlen(headstr), DIAL_LEFTMARG,hboxy,eboxw,hboxh,""); // Display dialog box bae_setintpar(16,id); dialres=bae_dialaskparams("!"+(prompt=="" ? " " : prompt),0, DIAL_LEFTMARG+eboxw+DIAL_RIGHTSMARG,cy+0.2); bae_dialgetdata(editidx,0,0.0,answer); for (i=0;i=entryn) { markonn=markoffn=0; for (i=0;i0 && markoffn>0) { sprintf(msg,UPRTOGGLEWAR,markonn,markoffn); bae_msgbox(1,msg,""); } answer=""; continue; // Mark unreferenced case 2 : // Check for referenced elements switch (ddbcl) { // Schematic symbol/label case DDBCLSSYM : case DDBCLSLAB : for (i=0;iMAXMENULINE) { sbidx=bae_dialaddcontrol(PA_SB|PA_HBRDREL,0,0,0,0.0,0.0,0.0,"", 0,butx,cy,DIAL_RIGHTEMARG,""); for (i=0;i0 && elemn>MAXMENULINE) ? 0 : PA_GRAYED),0,0.0,""); bae_dialsetdata(nbutidx,PA_ACT|(((esidx+MAXMENULINE)MAXMENULINE) ? 0 : PA_GRAYED),0,0.0,""); if (sbidx>=0) bae_dialsetdata(sbidx,PA_SB|PA_HBRDREL,esidx,0.0,""); // Build the element comment table menu for (i=0;i0 ? REPLIBDIFFP : REPLIBDIFFL, macro.NAME,ddbclassname(macro.CLASS)); msgn++; ddbupdtime( fname,macro.CLASS,"*"+macro.NAME,size,0,0,0,0,0); sprintf(msgl[msgn],REPPRJENT, pday,pmon,pyear,phour,pmin,psec,size); msgn++; ddbupdtime( fname,macro.CLASS,"*"+macro.NAME,size,0,0,0,0,0); sprintf(msgl[msgn],REPLIBENT, lday,lmon,lyear,lhour,lmin,lsec,size); msgn++; } if (msgn) { for (i=msgn-1;i>=0;i--) msgl[i+3]=msgl[i]; // Build the popup menu header sprintf(msgl[0],REPPRJHEAD,fname); sprintf(msgl[1],REPLIBHEAD,strgetvarfilename(libfname)); msgl[2]=" "; msgn+=3; entryl[0]=UPRUPDLIB; entryn=1; // Show report with popup menu bae_setintpar(16,3054); if (popupmenu(5,REPLIBCOMP,msgl,msgn,entryl,entryn,UINPOPABORT, 0,-1,-1,msgn+entryn+2,100,0,"")==UPRUPDLIB) { bae_clriactqueue(); switch (bae_planddbclass()) { case DDBCLSSYM : bae_storemenuiact(1,1,LMB); break; case DDBCLSLAB : bae_storemenuiact(1,2,LMB); break; case DDBCLSMRK : bae_storemenuiact(1,3,LMB); break; case DDBCLSCM : default : bae_storemenuiact(1,0,LMB); } bae_storetextiact(1,fname); bae_storetextiact(1,bae_planename()); bae_storetextiact(1,libfname); if (bae_plannotsaved()) bae_storetextiact(1,M_UINYES()); bae_callmenu(206); } } else { sprintf(fname,REPLIBOK,strgetvarfilename(libfname)); bae_prtdialog(fname); } } // Export definition file void defexport() { string fname /* Library file name */; string ename = "" /* Element name */; string dfname /* Output file name */; string logldef /* Logical library definition */; string msg /* Message buffer */; int dfh /* Output file handle */; int dcnt = 0 /* Definition count */; // Select the library DDB file if (bae_askddbfname(fname,0,UPRLFILE)) error_abort(); // Get the output file name dfname=convstring(fname,0)+DEFEXT; if (bae_askfilename(dfname,DEFEXT,UPRDFILE) || dfname=="") error_abort(); // Test the output file fseterrmode(0); if ((dfh=fopen(dfname,0))!=(-1)) { fclose(dfh); fseterrmode(1); sprintf(msg,UPRFEXISTS,dfname); if (bae_msgboxverify(msg,"")!=1) error_abort(); } fseterrmode(1); // Open the output file dfh=fopen(dfname,1); // Write the definition file header fprintf(dfh,"loglib\n\n"); // Scan all definition entries while (scanddbenames(fname,DDBCLLLIB,ename)==1) // Try to load definition from job file if (con_getlogpart(fname,ename,LINELEN,logldef)==0) { // Write the definition fprintf(dfh,"%s\n",logldef); dcnt++; } // Write the definition file end fprintf(dfh,"end.\n"); sprintf(msg,REPDEFDONE,dcnt,dfname); bae_prtdialog(msg); } // Export rule source file void ruleexport() { string fname /* Library file name */; string ename = "" /* Element name */; string dfname /* Output file name */; string ruledef /* Rule definition */; string msg /* Message buffer */; int dfh /* Output file handle */; int rcnt = 0 /* Rule count */; // Select the library DDB file if (bae_askddbfname(fname,0,UPRLFILE)) error_abort(); // Get the output file name if (bae_askfilename(dfname,RULEXT,UPRDFILE) || dfname=="") error_abort(); // Test the output file fseterrmode(0); if ((dfh=fopen(dfname,0))!=(-1)) { fclose(dfh); fseterrmode(1); sprintf(msg,UPRFEXISTS,dfname); if (bae_msgboxverify(msg,"")!=1) error_abort(); } fseterrmode(1); // Open the output file dfh=fopen(dfname,1); // Scan all rule source entries while (scanddbenames(fname,DDBCLRULS,ename)==1) // Try to load rule source from job file if (rulesource(fname,ename,ruledef)==0) { // Write the rule definition fprintf(dfh,"%s\n",ruledef); rcnt++; } sprintf(msg,REPRULDONE,rcnt,dfname); bae_prtdialog(msg); } // Name pattern report void patternreport() { index C_POOL pool /* Pool element index */; string filename = "" /* SCM library file name */; string ename = "" /* Element name */; string namepat /* Current name pattern */; STRINGS hl /* Header string list */; STRINGS el /* Entry string list */; int en = 0 /* Entry string count */; STRINGS snl /* Symbol name list */; STRINGS spl /* Symbol name pattern list */; int maxlen = 0 /* Max. entry length */; int cnt /* Entry count */; int mode /* Report mode */; int i /* Loop control variable */; // Select the report mode bae_promptdialog(UPRSELREPM); switch (bae_askmenu(3,UPRREPM0,UPRREPM1,UPRABORT)) { /* Pattern report */ case 0 : mode=0; break; /* Symbol report */ case 1 : mode=1; break; default : error_abort(); } // Select SCM database file if ((filename=askddbfile(UPRSELDDB,DDBCLSSYM))=="") // Abort error_abort(); // Scan the symbol macros bae_nameclr(); while (scanddbenames(filename,DDBCLSSYM,ename)==1) { // Get symbol name pattern cap_macload(pool,filename,ename,DDBCLSSYM); namepat=pool.MACRO.PNAMEPAT; cap_macrelease(pool); if (mode==0) { bae_nameadd(namepat,"","",ename,2); if (strlen(namepat)>maxlen) maxlen=strlen(namepat); } else { snl[en]=ename; spl[en]=namepat; en++; if (strlen(ename)>maxlen) maxlen=strlen(ename); } } sprintf(hl[0],mode==0 ? UPRPATLIST : UPRSPATLIST, convstring(filename,0)); hl[1]=" "; if (mode==0) { en=0; while (bae_nameget(en,namepat,"","",ename,cnt)==0) { sprintf(el[en],REPPATTERN,maxlen,namepat,cnt,ename); en++; } } else { for (i=0;i