JBoolean GetConstructor ( const JString& flClass, const JString& flType, JString* label, JString* className, JString* argList ) { if (flClass == "FL_BOX" && flType == "NO_BOX" && !label->IsEmpty()) { const JBoolean ok = SplitClassNameAndArgs(*label, className, argList); label->Clear(); return ok; } ifstream classMap(classMapFile); classMap >> ws; while (1) { if (classMap.peek() == '#') { JIgnoreLine(classMap); } else { const JString aClass = JReadUntilws(classMap); if (classMap.eof() || classMap.fail()) { break; } const JString aType = JReadUntilws(classMap); if (aClass == flClass && (aType == "*" || aType == flType)) { const JString s = JReadUntilws(classMap); return SplitClassNameAndArgs(s, className, argList); } else { JIgnoreLine(classMap); } } classMap >> ws; } // falling through means that nothing matched return kJFalse; }
void JStringManager::MergeFile ( istream& input, const JBoolean debug ) { JUInt format; input >> format; if (format != kASCIIFormat) { return; } JString id; while (1) { input >> ws; while (!input.eof() && input.peek() == '#') // peek() at eof sets fail() { JIgnoreLine(input); input >> ws; } if (input.eof() || input.fail()) { break; } id = JReadUntilws(input); if (debug) { cout << id << endl; } if (input.eof() || input.fail()) { break; } JString* s = new JString; assert( s != NULL ); input >> *s; if (input.eof() || input.fail()) { delete s; break; } if (CanOverride(id)) { SetElement(id, s, JPtrArrayT::kDelete); } else if (!SetNewElement(id, s)) { delete s; } } }
void CBCPreprocessor::ReadSetup ( istream& input, const JFileVersion vers ) { assert( vers >= 28 ); itsMacroList->DeleteAll(); if (vers >= 71) { input >> ws; JIgnoreLine(input); }
JFSBinding::JFSBinding ( istream& input, const JFileVersion vers, const JBoolean isSystem, JBoolean* isDefault, JBoolean* del ) : itsIsSystemFlag(isSystem), itsNameRegex(NULL), itsContentRegex(NULL) { input >> itsPattern >> itsCmd; if (vers < 2) { ConvertCommand(&itsCmd); JIgnoreLine(input); // alternate cmd *isDefault = JI2B(itsPattern == kOrigDefaultMarker); if (*isDefault) { itsPattern.Clear(); } itsCmdType = kRunPlain; itsSingleFileFlag = itsCmd.Contains("$"); } else { *isDefault = itsPattern.IsEmpty(); input >> itsCmdType >> itsSingleFileFlag; } *del = itsCmd.IsEmpty(); if (!(*del)) { UpdateRegex(); } }
void CBSymbolList::ReadSymbolList ( istream& input, const CBLanguage lang, const JCharacter* fullName, const JFAID_t fileID ) { JString path, fileName; JSplitPathAndName(fullName, &path, &fileName); input >> ws; while (input.peek() == '!') { JIgnoreLine(input); input >> ws; } JStringPtrMap<JString> flags(JPtrArrayT::kDeleteAll); while (1) { JString* name = new JString; assert( name != NULL ); input >> ws; *name = JReadUntil(input, '\t'); // symbol name if (input.eof() || input.fail()) { delete name; break; } JIgnoreUntil(input, '\t'); // file name JIndex lineIndex; input >> lineIndex; // line index ReadExtensionFlags(input, &flags); JCharacter typeChar = ' '; JString* value; if (flags.GetElement("kind", &value) && !value->IsEmpty()) { typeChar = value->GetFirstCharacter(); } JString* signature = NULL; if (flags.GetElement("signature", &value) && !value->IsEmpty()) { signature = new JString(*value); assert( signature != NULL ); signature->PrependCharacter(' '); } if (IgnoreSymbol(*name)) { delete name; } else { const Type type = DecodeSymbolType(lang, typeChar); if (signature == NULL && (IsFunction(type) || IsPrototype(type))) { signature = new JString(" ( )"); assert( signature != NULL ); } const SymbolInfo info(name, signature, lang, type, kJFalse, fileID, lineIndex); itsSymbolList->InsertSorted(info); // add file:name if (IsFileScope(type)) { JString* name1 = new JString(fileName); assert( name1 != NULL ); *name1 += ":"; *name1 += *name; JString* sig1 = NULL; if (signature != NULL) { sig1 = new JString(*signature); assert( sig1 != NULL ); } const SymbolInfo info1(name1, sig1, lang, type, kJTrue, fileID, lineIndex); itsSymbolList->InsertSorted(info1); } } } }
void GenerateCode ( istream& input, ostream& output, const JString& stringPath, const JString& formName, const JString& tagName, const JString& userTopEnclVarName, JPtrArray<JString>* objTypes, JPtrArray<JString>* objNames ) { JIndex i; // width input >> ws; JString line = JReadUntilws(input); assert( line == kFormWidthMarker ); JSize formWidth; input >> formWidth; // height input >> ws; line = JReadUntilws(input); assert( line == kFormHeightMarker ); JSize formHeight; input >> formHeight; // object count (marker contains whitespace) input >> ws; line = JReadUntil(input, ':') + ":"; assert( line == kFormObjCountMarker ); JSize itemCount; input >> itemCount; // create window const JString topEnclFrameName = tagName + "_Frame"; const JString topEnclApName = tagName + "_Aperture"; JString topEnclVarName; if (tagName == kDefaultDelimTag) { topEnclVarName = kDefTopEnclVarName; output << " JXWindow* window = new JXWindow(this, "; output << formWidth << ',' << formHeight; output << ", \"\");" << endl; output << " assert( window != NULL );" << endl; output << endl; } else { assert( !userTopEnclVarName.IsEmpty() ); topEnclVarName = userTopEnclVarName; output << " const JRect "; topEnclFrameName.Print(output); output << " = "; topEnclVarName.Print(output); output << "->GetFrame();" << endl; output << " const JRect "; topEnclApName.Print(output); output << " = "; topEnclVarName.Print(output); output << "->GetAperture();" << endl; output << " "; topEnclVarName.Print(output); output << "->AdjustSize(" << formWidth << " - "; topEnclApName.Print(output); output << ".width(), " << formHeight << " - "; topEnclApName.Print(output); output << ".height());" << endl; output << endl; } // We need to calculate the enclosure for each object. Since objects // are drawn in the order added, an object must come after its enclosure // in the list in order to be visible. JArray<JRect> rectList(10); JArray<JBoolean> isInstanceVar(10); // This array is used to send the options to ApplyOptions. // It does not own the pointers that it contains. JPtrArray<JString> optionValues(JPtrArrayT::kForgetAll, kOptionCount); for (i=1; i<=kOptionCount; i++) { optionValues.Append(NULL); } // generate code for each object JStringManager stringMgr; JIndex objCount = 1; for (i=1; i<=itemCount; i++) { // check for start-of-object input >> ws; line = JReadLine(input); assert( line == kBeginObjLine ); // object class JString flClass = JReadLine(input); RemoveIdentifier(kObjClassMarker, &flClass); // object type JString flType = JReadLine(input); RemoveIdentifier(kObjTypeMarker, &flType); // object frame input >> ws; line = JReadUntilws(input); assert( line == kObjRectMarker ); JCoordinate x,y,w,h; input >> x >> y >> w >> h >> ws; const JRect frame(y, x, y+h, x+w); rectList.AppendElement(frame); // box type JString boxType = JReadLine(input); RemoveIdentifier(kObjBoxTypeMarker, &boxType); // colors input >> ws; line = JReadUntilws(input); assert( line == kObjColorsMarker ); JString col1 = JReadUntilws(input); optionValues.SetElement(kCol1Index, &col1, JPtrArrayT::kForget); JString col2 = JReadUntilws(input); optionValues.SetElement(kCol2Index, &col2, JPtrArrayT::kForget); // label info JString lAlign = JReadLine(input); RemoveIdentifier(kObjLAlignMarker, &lAlign); JString lStyle = JReadLine(input); RemoveIdentifier(kObjLStyleMarker, &lStyle); JString lSize = JReadLine(input); RemoveIdentifier(kObjLSizeMarker, &lSize); JString lColor = JReadLine(input); RemoveIdentifier(kObjLColorMarker, &lColor); JString label = JReadLine(input); RemoveIdentifier(kObjLabelMarker, &label); // shortcuts JString shortcuts = JReadLine(input); RemoveIdentifier(kObjShortcutMarker, &shortcuts); optionValues.SetElement(kShortcutsIndex, &shortcuts, JPtrArrayT::kForget); // resizing (ignored) JIgnoreLine(input); // gravity input >> ws; line = JReadUntilws(input); assert( line == kObjGravityMarker ); const JString nwGravity = JReadUntilws(input); const JString seGravity = JReadUntilws(input); // variable name JBoolean isLocal = kJFalse; JString* varName = new JString(JReadLine(input)); assert( varName != NULL ); RemoveIdentifier(kObjNameMarker, varName); if (varName->IsEmpty()) { isInstanceVar.AppendElement(kJFalse); GetTempVarName(tagName, varName, *objNames); isLocal = kJTrue; } else if (varName->GetFirstCharacter() == '(' && varName->GetLastCharacter() == ')') { isInstanceVar.AppendElement(kJFalse); isLocal = kJTrue; *varName = varName->GetSubstring(2, varName->GetLength()-1); } else if (varName->GetFirstCharacter() == '<' && varName->GetLastCharacter() == '>') { isInstanceVar.AppendElement(kJFalse); *varName = varName->GetSubstring(2, varName->GetLength()-1); } else { isInstanceVar.AppendElement(kJTrue); } objNames->Append(varName); // callback (ignored) JIgnoreLine(input); // callback argument JString cbArg = JReadLine(input); RemoveIdentifier(kObjCBArgMarker, &cbArg); JString cbArgExtra; do { cbArgExtra = JReadLine(input); cbArgExtra.TrimWhitespace(); } while (!cbArgExtra.IsEmpty()); // don't bother to generate code for initial box // if it is FL_BOX, FLAT_BOX, FL_COL1 if (i==1 && flClass == "FL_BOX" && flType == "FLAT_BOX" && col1 == "FL_COL1") { rectList.RemoveElement(objCount); isInstanceVar.RemoveElement(objCount); objNames->DeleteElement(objCount); continue; } // check for errors -- safe since we have read in entire object JString hSizing, vSizing; if (!ParseGravity(nwGravity, &hSizing, &vSizing)) { cerr << "Illegal sizing specification "; cerr << nwGravity << ',' << seGravity; cerr << " for '" << *varName << '\'' << endl; rectList.RemoveElement(objCount); isInstanceVar.RemoveElement(objCount); objNames->DeleteElement(objCount); continue; } if (*varName == topEnclVarName) { cerr << "Cannot use reserved name '" << topEnclVarName << '\'' << endl; rectList.RemoveElement(objCount); isInstanceVar.RemoveElement(objCount); objNames->DeleteElement(objCount); continue; } // get the object's enclosure JIndex enclIndex; JString enclName; JRect localFrame = frame; if (GetEnclosure(rectList, objCount, &enclIndex)) { enclName = *(objNames->NthElement(enclIndex)); const JRect enclFrame = rectList.GetElement(enclIndex); localFrame.Shift(-enclFrame.topLeft()); } else { enclName = topEnclVarName; } // get the class name and additional arguments JString* className = new JString; assert( className != NULL ); objTypes->Append(className); JString argList; if (!GetConstructor(flClass, flType, &label, className, &argList)) { cerr << "Unsupported class: " << flClass << ", " << flType << endl; rectList.RemoveElement(objCount); isInstanceVar.RemoveElement(objCount); objNames->DeleteElement(objCount); objTypes->DeleteElement(objCount); continue; } // generate the actual code const JBoolean needCreate = NeedsCreateFunction(*className); output << " "; if (isLocal) { className->Print(output); output << "* "; } varName->Print(output); output << " =" << endl; output << " "; if (!needCreate) { output << "new "; } className->Print(output); if (needCreate) { output << "::Create"; } output << '('; if (!argList.IsEmpty()) { argList.Print(output); if (argList.GetLastCharacter() != ',') { output << ','; } output << ' '; } if (!cbArg.IsEmpty()) { cbArg.Print(output); if (cbArg.GetLastCharacter() != ',') { output << ','; } output << ' '; } if ((*className == "JXStaticText" && cbArg.IsEmpty()) || NeedsStringArg(*className)) { JString id = *varName; id += "::"; id += formName; id += "::"; id += tagName; // last since it is almost always the same output << "JGetString(\""; id.Print(output); output << "\"), "; stringMgr.SetElement(id, label, JPtrArrayT::kDelete); } enclName.Print(output); output << ',' << endl; output << " JXWidget::"; hSizing.Print(output); output << ", JXWidget::"; vSizing.Print(output); output << ", " << localFrame.left << ',' << localFrame.top << ", "; output << localFrame.width() << ',' << localFrame.height() << ");" << endl; output << " assert( "; varName->Print(output); output << " != NULL );" << endl; ApplyOptions(output, *className, formName, tagName, *varName, optionValues, lSize, lStyle, lColor, &stringMgr); if (*className == "JXStaticText" && cbArg.IsEmpty() && !lAlign.Contains("FL_ALIGN_TOP") && localFrame.height() <= 20) { output << " "; varName->Print(output); output << "->SetToLabel();" << endl; } output << endl; // now we know the object is valid objCount++; } // write string database JString dbFileName = stringPath + formName; if (tagName != kDefaultDelimTag) { dbFileName += kCustomTagMarker + tagName; } dbFileName += "_layout"; if (stringMgr.GetElementCount() > 0) { JEditVCS(dbFileName); ofstream dbOutput(dbFileName); stringMgr.WriteFile(dbOutput); } else { JRemoveVCS(dbFileName); JRemoveFile(dbFileName); } // reset enclosure size if (tagName != kDefaultDelimTag) { output << " "; topEnclVarName.Print(output); output << "->SetSize("; topEnclFrameName.Print(output); output << ".width(), "; topEnclFrameName.Print(output); output << ".height());" << endl; output << endl; } // throw away temporary variables objCount--; assert( objCount == isInstanceVar.GetElementCount() ); assert( objCount == objTypes->GetElementCount() ); assert( objCount == objNames->GetElementCount() ); for (i=objCount; i>=1; i--) { if (!isInstanceVar.GetElement(i)) { objTypes->DeleteElement(i); objNames->DeleteElement(i); } } }
void ApplyOptions ( ostream& output, const JString& className, const JString& formName, const JString& tagName, const JString& varName, const JPtrArray<JString>& values, const JString& flSize, const JString& flStyle, const JString& flColor, JStringManager* stringMgr ) { ifstream optionMap(optionMapFile); optionMap >> ws; while (1) { if (optionMap.peek() == '#') { JIgnoreLine(optionMap); } else { const JString aClassName = JReadUntilws(optionMap); if (optionMap.eof() || optionMap.fail()) { break; } else if (aClassName != className) { for (JIndex i=1; i<=kOptionCount; i++) { JIgnoreLine(optionMap); } } else { JIndex i; JBoolean supported; // shortcuts optionMap >> ws >> supported; if (supported) { optionMap >> ws; const JString function = JReadUntilws(optionMap); const JString* value = values.NthElement(kShortcutsIndex); if (!value->IsEmpty()) { JString id = varName; id += "::"; id += formName; id += "::shortcuts::"; id += tagName; // last since it is almost always the same output << " "; varName.Print(output); output << "->"; function.Print(output); output << "(JGetString(\""; id.Print(output); output << "\"));" << endl; JString* s = new JString(*value); assert( s != NULL ); stringMgr->SetElement(id, s, JPtrArrayT::kDelete); } } else { JIgnoreLine(optionMap); } // colors for (i=2; i<=kOptionCount; i++) { optionMap >> ws >> supported; if (supported) { optionMap >> ws; const JString defValue = JReadUntilws(optionMap); const JString function = JReadUntilws(optionMap); const JString* value = values.NthElement(i); if (*value != defValue) { JString jxColor; if (ConvertXFormsColor(*value, &jxColor)) { output << " "; varName.Print(output); output << "->"; function.Print(output); output << '('; jxColor.Print(output); output << ");" << endl; } else { cerr << "Unknown color: " << *value << endl; } } } else { JIgnoreLine(optionMap); } } } }
JBoolean JGetCurrentSVNRevision ( const JCharacter* fullName, JString* rev ) { JString path, name, entriesFileName, data, pattern; JSplitPathAndName(fullName, &path, &name); entriesFileName = JCombinePathAndName(path, kSubversionDirName); entriesFileName = JCombinePathAndName(entriesFileName, kSubversionFileName); JReadFile(entriesFileName, &data); if (data.BeginsWith("<?xml")) { pattern = "<entry[^>]+name=\"" + JRegex::BackslashForLiteral(name) + "\"(.|\n)*?>"; JRegex r(pattern); JIndexRange range; JArray<JIndexRange> matchList; if (r.Match(data, &range) && svn4RevisionPattern.MatchWithin(data, range, &matchList)) { *rev = data.GetSubstring(matchList.GetElement(2)); return kJTrue; } } else { std::istrstream input(data, data.GetLength()); const JString version = JReadLine(input); if (version == "8" || version == "9" || version == "10") { pattern = "\n\f\n" + name + "\n"; JBoolean found; JIgnoreUntil(input, pattern, &found); if (found) { const JString data2 = JReadUntil(input, '\f'); std::istrstream input2(data2, data2.GetLength()); JIgnoreLine(input2); // file JIgnoreLine(input2); // ??? JIgnoreLine(input2); // ??? JIgnoreLine(input2); // ??? JIgnoreLine(input2); // ??? JIgnoreLine(input2); // timestamp JIgnoreLine(input2); // hash JIgnoreLine(input2); // timestamp *rev = JReadLine(input2); if (input2.good()) { return kJTrue; } } } } rev->Clear(); return kJFalse; }
JBoolean JGetVCSRepositoryPath ( const JCharacter* origPath, JString* repoPath ) { JString path = origPath, name; if (JFileExists(origPath) || !JDirectoryExists(origPath)) // broken link { JSplitPathAndName(origPath, &path, &name); } const JVCSType type = JGetVCSType(path); JBoolean found = kJFalse; if (type == kJCVSType) { const JString cvsPath = JCombinePathAndName(path, kCVSDirName); JString fullName = JCombinePathAndName(cvsPath, "Root"); JReadFile(fullName, repoPath); fullName = JCombinePathAndName(cvsPath, "Repository"); JString repo; JReadFile(fullName, &repo); if (!repoPath->IsEmpty() && !repo.IsEmpty()) { *repoPath = JCombinePathAndName(*repoPath, repo); found = kJTrue; } } else if (type == kJSVNType) { JString entriesFileName, data; entriesFileName = JCombinePathAndName(path, kSubversionDirName); entriesFileName = JCombinePathAndName(entriesFileName, kSubversionFileName); JReadFile(entriesFileName, &data); if (data.BeginsWith("<?xml")) { JIndexRange range; JArray<JIndexRange> matchList; if (svn4RepositoryPattern1.Match(data, &range) && svn4RepositoryPattern2.MatchWithin(data, range, &matchList)) { *repoPath = data.GetSubstring(matchList.GetElement(2)); found = kJTrue; } } else { std::istrstream input(data, data.GetLength()); const JString version = JReadLine(input); if (version == "8" || version == "9" || version == "10") { JIgnoreLine(input); // ??? JIgnoreLine(input); // dir JIgnoreLine(input); // latest update version *repoPath = JReadLine(input); found = JI2B(input.good()); } } } if (found) { if (!name.IsEmpty()) { *repoPath = JCombinePathAndName(*repoPath, name); } return kJTrue; } else { repoPath->Clear(); return kJFalse; } }