int main(int argc, char *argv[]) { //unsigned char header[3]; char sector[SECSIZE]; //register int i; int fd, readed; char file[1024]; char systemfile[256] = "spc1000.bin"; char errormsg[1024]; if (argv[1] > 0) strcpy(file, (char*)argv[1]); else { printf("Usage: %s target_disk_image\n", argv[0]); exit(1); } // open image if (checkFileExistance(file) == 0) { msg(LOG_WARN, "Image '%s' not found, exiting.\n", argv[1]); exit(-1); } FILE *imageFile = openImageRW(file); /* open boot loader (boot.bin) for reading */ if (argc > 1) { strcpy(systemfile, argv[2]); printf("system file: %s\n", systemfile); } FILE *f; if ((f = fopen(systemfile, "rb")) < 0) { sprintf(errormsg, "file %s error", systemfile); perror(errormsg); exit(1); } /* read system loader */ int t = 0, s = 0, len =1; memset((char *) sector, 0, SECSIZE); setDiskSectorPos(t,s); while ((readed = fread((char *) sector, 1, SECSIZE, f)) > 0) { writeDiskSector(sector, imageFile); }; fclose(f); fclose(imageFile); return(0); }
// helper for fillSourceList: // search recursive for a file, starting from a base dir static bool checkFileExistance(QString& dir, const QString& name) { // we leave this in... qDebug("Checking %s/%s", dir.ascii(), name.ascii()); if (QFile::exists(dir + "/" + name)) return true; // check in subdirectories QDir d(dir); d.setFilter( QDir::Dirs | QDir::NoSymLinks ); d.setSorting( QDir::Unsorted ); QStringList subdirs = d.entryList(); QStringList::Iterator it =subdirs.begin(); for(; it != subdirs.end(); ++it ) { if (*it == "." || *it == ".." || *it == "CVS") continue; dir = d.filePath(*it); if (checkFileExistance(dir, name)) return true; } return false; }
/* If sourceList is empty we set the source file name into the header, * else this code is of a inlined function, and we add "inlined from..." */ void SourceView::fillSourceFile(TraceFunctionSource* sf, int fileno) { if (!sf) return; if (0) qDebug("Selected Item %s", _selectedItem ? _selectedItem->name().ascii() : "(none)"); TraceLineMap::Iterator lineIt, lineItEnd; int nextCostLineno = 0, lastCostLineno = 0; bool validSourceFile = (!sf->file()->name().isEmpty()); TraceLine* sLine = 0; if (_selectedItem) { if (_selectedItem->type() == TraceItem::Line) sLine = (TraceLine*) _selectedItem; if (_selectedItem->type() == TraceItem::Instr) sLine = ((TraceInstr*)_selectedItem)->line(); } if (validSourceFile) { TraceLineMap* lineMap = sf->lineMap(); if (lineMap) { lineIt = lineMap->begin(); lineItEnd = lineMap->end(); // get first line with cost of selected type while(lineIt != lineItEnd) { if (&(*lineIt) == sLine) break; if ((*lineIt).hasCost(_costType)) break; if (_costType2 && (*lineIt).hasCost(_costType2)) break; ++lineIt; } nextCostLineno = (lineIt == lineItEnd) ? 0 : (*lineIt).lineno(); if (nextCostLineno<0) { kdError() << "SourceView::fillSourceFile: Negative line number " << nextCostLineno << endl << " Function '" << sf->function()->name() << "'" << endl << " File '" << sf->file()->name() << "'" << endl; nextCostLineno = 0; } } if (nextCostLineno == 0) { new SourceItem(this, this, fileno, 0, false, i18n("There is no cost of current selected type associated")); new SourceItem(this, this, fileno, 1, false, i18n("with any source line of this function in file")); new SourceItem(this, this, fileno, 2, false, QString(" '%1'").arg(sf->function()->prettyName())); new SourceItem(this, this, fileno, 3, false, i18n("Thus, no annotated source can be shown.")); return; } } QString filename = sf->file()->shortName(); QString dir = sf->file()->directory(); if (!dir.isEmpty()) filename = dir + "/" + filename; if (nextCostLineno>0) { // we have debug info... search for source file if (!QFile::exists(filename)) { QStringList list = Configuration::sourceDirs(_data, sf->function()->object()); QStringList::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) { dir = *it; if (checkFileExistance(dir, sf->file()->shortName())) break; } if (it == list.end()) nextCostLineno = 0; else { filename = dir + "/" + sf->file()->shortName(); // no need to search again sf->file()->setDirectory(dir); } } } // do it here, because the source directory could have been set before if (childCount()==0) { setColumnText(4, validSourceFile ? i18n("Source ('%1')").arg(filename) : i18n("Source (unknown)")); } else { new SourceItem(this, this, fileno, 0, true, validSourceFile ? i18n("--- Inlined from '%1' ---").arg(filename) : i18n("--- Inlined from unknown source ---")); } if (nextCostLineno == 0) { new SourceItem(this, this, fileno, 0, false, i18n("There is no source available for the following function:")); new SourceItem(this, this, fileno, 1, false, QString(" '%1'").arg(sf->function()->prettyName())); if (sf->file()->name().isEmpty()) { new SourceItem(this, this, fileno, 2, false, i18n("This is because no debug information is present.")); new SourceItem(this, this, fileno, 3, false, i18n("Recompile source and redo the profile run.")); if (sf->function()->object()) { new SourceItem(this, this, fileno, 4, false, i18n("The function is located in this ELF object:")); new SourceItem(this, this, fileno, 5, false, QString(" '%1'") .arg(sf->function()->object()->prettyName())); } } else { new SourceItem(this, this, fileno, 2, false, i18n("This is because its source file cannot be found:")); new SourceItem(this, this, fileno, 3, false, QString(" '%1'").arg(sf->file()->name())); new SourceItem(this, this, fileno, 4, false, i18n("Add the folder of this file to the source folder list.")); new SourceItem(this, this, fileno, 5, false, i18n("The list can be found in the configuration dialog.")); } return; } // initialisation for arrow drawing // create sorted list of jumps (for jump arrows) TraceLineMap::Iterator it = lineIt, nextIt; _lowList.clear(); _highList.clear(); while(1) { nextIt = it; ++nextIt; while(nextIt != lineItEnd) { if (&(*nextIt) == sLine) break; if ((*nextIt).hasCost(_costType)) break; if (_costType2 && (*nextIt).hasCost(_costType2)) break; ++nextIt; } TraceLineJumpList jlist = (*it).lineJumps(); TraceLineJump* lj; for (lj=jlist.first();lj;lj=jlist.next()) { if (lj->executedCount()==0) continue; // skip jumps to next source line with cost //if (lj->lineTo() == &(*nextIt)) continue; _lowList.append(lj); _highList.append(lj); } it = nextIt; if (it == lineItEnd) break; } _lowList.sort(); _highList.sort(); _lowList.first(); // iterators to list start _highList.first(); _jump.resize(0); char buf[256]; bool inside = false, skipLineWritten = true; int readBytes; int fileLineno = 0; SubCost most = 0; TraceLine* currLine; SourceItem *si, *si2, *item = 0, *first = 0, *selected = 0; QFile file(filename); if (!file.open(IO_ReadOnly)) return; while (1) { readBytes=file.readLine(buf, sizeof( buf )); if (readBytes<=0) { // for nice empty 4 lines after function with EOF buf[0] = 0; } if (readBytes >= (int) sizeof( buf )) { qDebug("%s:%d Line too long\n", sf->file()->name().ascii(), fileLineno); } else if ((readBytes>0) && (buf[readBytes-1] == '\n')) buf[readBytes-1] = 0; // keep fileLineno inside [lastCostLineno;nextCostLineno] fileLineno++; if (fileLineno == nextCostLineno) { currLine = &(*lineIt); // get next line with cost of selected type ++lineIt; while(lineIt != lineItEnd) { if (&(*lineIt) == sLine) break; if ((*lineIt).hasCost(_costType)) break; if (_costType2 && (*lineIt).hasCost(_costType2)) break; ++lineIt; } lastCostLineno = nextCostLineno; nextCostLineno = (lineIt == lineItEnd) ? 0 : (*lineIt).lineno(); } else currLine = 0; // update inside if (!inside) { if (currLine) inside = true; } else { if ( (fileLineno > lastCostLineno) && ((nextCostLineno == 0) || (fileLineno < nextCostLineno - Configuration::noCostInside()) )) inside = false; } int context = Configuration::context(); if ( ((lastCostLineno==0) || (fileLineno > lastCostLineno + context)) && ((nextCostLineno==0) || (fileLineno < nextCostLineno - context))) { if (lineIt == lineItEnd) break; if (!skipLineWritten) { skipLineWritten = true; // a "skipping" line: print "..." instead of a line number strcpy(buf,"..."); } else continue; } else skipLineWritten = false; si = new SourceItem(this, this, fileno, fileLineno, inside, QString(buf), currLine); if (!currLine) continue; if (!selected && (currLine == sLine)) selected = si; if (!first) first = si; if (currLine->subCost(_costType) > most) { item = si; most = currLine->subCost(_costType); } si->setOpen(true); TraceLineCallList list = currLine->lineCalls(); TraceLineCall* lc; for (lc=list.first();lc;lc=list.next()) { if ((lc->subCost(_costType)==0) && (lc->subCost(_costType2)==0)) continue; if (lc->subCost(_costType) > most) { item = si; most = lc->subCost(_costType); } si2 = new SourceItem(this, si, fileno, fileLineno, currLine, lc); if (!selected && (lc->call()->called() == _selectedItem)) selected = si2; } TraceLineJumpList jlist = currLine->lineJumps(); TraceLineJump* lj; for (lj=jlist.first();lj;lj=jlist.next()) { if (lj->executedCount()==0) continue; new SourceItem(this, si, fileno, fileLineno, currLine, lj); } } if (selected) item = selected; if (item) first = item; if (first) { ensureItemVisible(first); _inSelectionUpdate = true; setCurrentItem(first); _inSelectionUpdate = false; } file.close(); // for arrows: go down the list according to list sorting sort(); QListViewItem *item1, *item2; for (item1=firstChild();item1;item1 = item1->nextSibling()) { si = (SourceItem*)item1; updateJumpArray(si->lineno(), si, true, false); for (item2=item1->firstChild();item2;item2 = item2->nextSibling()) { si2 = (SourceItem*)item2; if (si2->lineJump()) updateJumpArray(si->lineno(), si2, false, true); else si2->setJumpArray(_jump); } } if (arrowLevels()) setColumnWidth(3, 10 + 6*arrowLevels() + itemMargin() * 2); else setColumnWidth(3, 0); }