// -------------------------------------------------------------------------- void DiagramDialog::slotReadVars(int) { QFileInfo Info(defaultDataSet); QString DocName = ChooseData->currentText()+".dat"; QFile file(Info.dirPath() + QDir::separator() + DocName); if(!file.open(IO_ReadOnly)) { return; } QString Line, tmp, Var; QTextStream ReadWhole(&file); QString FileString = ReadWhole.read(); // read whole data file file.close(); ChooseVars->clear(); int i=0, j=0; i = FileString.find('<')+1; if(i > 0) do { j = FileString.find('>', i); Line = FileString.mid(i, j-i); i = FileString.find('<', j)+1; Var = Line.section(' ', 1, 1).remove('>'); if(Var.at(0) == '_') continue; if(Line.left(3) == "dep") { tmp = Line.section(' ', 2); new QListViewItem(ChooseVars, Var, "dep", tmp.remove('>')); } else if(Line.left(5) == "indep") { tmp = Line.section(' ', 2, 2); new QListViewItem(ChooseVars, Var, "indep", tmp.remove('>')); } } while(i > 0); }
// ---------------------------------------------------- void QucsLib::slotSelectLibrary(int Index) { int Start, End, NameStart, NameEnd; End = Library->count()-1; if(Library->text(End) == tr("Search result")) { if(Index < End) Library->removeItem(End); // if search result still there -> remove it else return; } CompList->clear(); LibraryComps.clear(); DefaultSymbol = ""; QFile file; if(Index < UserLibCount) // Is it user library ? file.setName(UserLibDir.absPath() + QDir::separator() + Library->text(Index) + ".lib"); else file.setName(QucsSettings.LibDir + Library->text(Index) + ".lib"); if(!file.open(IO_ReadOnly)) { QMessageBox::critical(this, tr("Error"), tr("Cannot open \"%1\".").arg( QucsSettings.LibDir + Library->text(Index) + ".lib")); return; } QTextStream ReadWhole(&file); QString LibraryString = ReadWhole.read(); file.close(); Start = LibraryString.find("<Qucs Library "); if(Start < 0) { QMessageBox::critical(this, tr("Error"), tr("Library is corrupt.")); return; } End = LibraryString.find('>', Start); if(End < 0) { QMessageBox::critical(this, tr("Error"), tr("Library is corrupt.")); return; } QString LibName = LibraryString.mid(Start, End-Start).section('"', 1, 1); Start = LibraryString.find("\n<", End); if(Start < 0) return; if(LibraryString.mid(Start+2, 14) == "DefaultSymbol>") { End = LibraryString.find("\n</DefaultSymbol>"); if(End < 0) { QMessageBox::critical(this, tr("Error"), tr("Library is corrupt.")); return; } DefaultSymbol = LibraryString.mid(Start+16, End-Start-16); Start = End + 3; } while((Start=LibraryString.find("\n<Component ", Start)) > 0) { Start++; NameStart = Start + 11; NameEnd = LibraryString.find('>', NameStart); if(NameEnd < 0) continue; End = LibraryString.find("\n</Component>", NameEnd); if(End < 0) continue; End += 13; CompList->insertItem(LibraryString.mid(NameStart, NameEnd-NameStart)); LibraryComps.append(LibName+'\n'+LibraryString.mid(Start, End-Start)); Start = End; } CompList->setSelected(0, true); // select first item }
// --------------------------------------------------------------------- // Loads the symbol for the subcircuit from the schematic file and // returns the number of painting elements. int Subcircuit::loadSymbol(const QString& DocName) { QFile file(DocName); if(!file.open(IO_ReadOnly)) return -1; QString Line; // ***************************************************************** // To strongly speed up the file read operation the whole file is // read into the memory in one piece. QTextStream ReadWhole(&file); QString FileString = ReadWhole.read(); file.close(); QTextStream stream(&FileString, IO_ReadOnly); // read header ************************** do { if(stream.atEnd()) return -2; Line = stream.readLine(); Line = Line.stripWhiteSpace(); } while(Line.isEmpty()); if(Line.left(16) != "<Qucs Schematic ") // wrong file type ? return -3; Line = Line.mid(16, Line.length()-17); if(!checkVersion(Line)) // wrong version number ? return -4; // read content ************************* while(!stream.atEnd()) { Line = stream.readLine(); if(Line == "<Symbol>") break; } x1 = y1 = INT_MAX; x2 = y2 = INT_MIN; int z=0, Result; while(!stream.atEnd()) { Line = stream.readLine(); if(Line == "</Symbol>") { x1 -= 4; // enlarge component boundings a little x2 += 4; y1 -= 4; y2 += 4; return z; // return number of ports } Line = Line.stripWhiteSpace(); if(Line.at(0) != '<') return -5; if(Line.at(Line.length()-1) != '>') return -6; Line = Line.mid(1, Line.length()-2); // cut off start and end character Result = analyseLine(Line, 1); if(Result < 0) return -7; // line format error z += Result; } return -8; // field not closed }
// --------------------------------------------------------------------- // Loads the section with name "Name" from library file into "Section". int LibComp::loadSection(const QString& Name, QString& Section, QStringList *Includes) { QDir Directory(QucsSettings.LibDir); QFile file(Directory.absFilePath(Props.first()->Value + ".lib")); if(!file.open(QIODevice::ReadOnly)) return -1; QString libDefaultSymbol; QTextStream ReadWhole(&file); Section = ReadWhole.read(); file.close(); if(Section.left(14) != "<Qucs Library ") // wrong file type ? return -2; int Start, End = Section.indexOf(' ', 14); if(End < 15) return -3; QString Line = Section.mid(14, End-14); // extract version string VersionTriplet LibVersion = VersionTriplet(Line); if (LibVersion > QucsVersion) // wrong version number ? return -3; if(Name == "Symbol") { Start = Section.indexOf("\n<", 14); // library has default symbol if(Start > 0) if(Section.mid(Start+2, 14) == "DefaultSymbol>") { Start += 16; End = Section.indexOf("\n</DefaultSymbol>", Start); if(End < 0) return -9; libDefaultSymbol = Section.mid(Start, End-Start); } } // search component Line = "\n<Component " + Props.next()->Value + ">"; Start = Section.indexOf(Line); if(Start < 0) return -4; // component not found Start = Section.indexOf('\n', Start); if(Start < 0) return -5; // file corrupt Start++; End = Section.indexOf("\n</Component>", Start); if(End < 0) return -6; // file corrupt Section = Section.mid(Start, End-Start+1); // search model includes if(Includes) { int StartI, EndI; StartI = Section.indexOf("<"+Name+"Includes"); if(StartI >= 0) { // includes found StartI = Section.indexOf('"', StartI); if(StartI < 0) return -10; // file corrupt EndI = Section.indexOf('>', StartI); if(EndI < 0) return -11; // file corrupt StartI++; EndI--; QString inc = Section.mid(StartI, EndI-StartI); QStringList f = QStringList::split(QRegExp("\"\\s+\""), inc); for(QStringList::Iterator it = f.begin(); it != f.end(); ++it ) { Includes->append(*it); } } } // search model Start = Section.indexOf("<"+Name+">"); if(Start < 0) if((Name == "Symbol") && (~libDefaultSymbol.isEmpty())) { // component does not define its own symbol but the library defines a default symbol Section = libDefaultSymbol; return 0; } else { return -7; // symbol not found } Start = Section.indexOf('\n', Start); if(Start < 0) return -8; // file corrupt while(Section.at(++Start) == ' ') ; End = Section.indexOf("</"+Name+">", Start); if(End < 0) return -9; // file corrupt // snip actual model Section = Section.mid(Start, End-Start); return 0; }