int QgsDxfExport::writeToFile( QIODevice* d ) { if ( !d ) { return 1; } if ( !d->isOpen() && !d->open( QIODevice::WriteOnly ) ) { return 2; } mTextStream.setDevice( d ); writeHeader(); writeTables(); writeBlocks(); writeEntities(); writeEndFile(); return 0; }
int main(int argc, char **argv) { atexit(cleanup); options = calloc(sizeof(struct opts_t), 1); tableList = calloc(sizeof(*tableList), 1); options->mode = -1; options->rating = RATING_UNDEFINED; if (argc < 2) exitmsg(1, "Try -help for usage information\n"); parseArgs(argv + 1, options); if (!options->backlog_path[0]) snprintf(options->backlog_path, 256, "%s/.backlog", getenv("HOME")); if (!modified && readTables(tableList, options->backlog_path)) printf("Couldn't open '%s': %s\nYou can force the creation of this file by passing -force\n\n", options->backlog_path, strerror(errno)); struct entry_t *entry = 0; struct table_t *table = 0; if (options->mode == RATING_UNDEFINED && !options->searchMode && !modified) exitmsg(1, "Must specify a mode\n"); if (options->rating != RATING_UNDEFINED && (options->rating < -1 || options->rating > 10)) exitmsg(1, "Rating must be in the range of -1 to 10\n"); char *entrystr = "Entry not found\n"; char *tablestr = "Table not found\n"; char *err_dupe = "An entry with that name already exists in that table\n"; char *err_dupe_table = "A table with that name already exists\n"; char help_msg[] = "Available options:\n" " -t\n" "\tSwitch to table mode\n" " -help\n" "\tPrint this message\n" " -insert\n" "\tAdd entry/table\n" " -rm\n" "\tRemove entry/table\n" " -mv\n" "\tMove entry between tables\n" " -ls\n" "\tList tables, can be used with -name to print specific table\n" " -find\n" "\tSearch for entry, can be used with -name to search within table\n" " -rate <INT>\n" "\tSet rating on entry\n" " -rename\n" "\tRename entry/table\n" " -name <STRING>\n" "\tSet name\n" " -new <STRING>\n" "\tSet new name\n" " -src <STRING>\n" "\tSet source name\n" " -dest <STRING>\n" "\tSet destination name\n" " -roll\n" "\tReturn random entry\n" " -mal\n" "\tSearch MAL for entry\n" " -nyaa\n" "\tSearch Nyaa for entry\n" " -baka\n" "\tSearch BakaBT for entry (through Google)\n" " -anidb\n" "\tSearch AniDB for entry\n" " -force\n" "\tForce write-out to backlog file\n" " -path\n" "\tOverride the default backlog path (~/.backlog)\n" " -nobak\n" "\tDon't backup backlog file"; if (options->mode == MODE_LIST) { //List tables. if (options->sourceName) { table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); } if (table) { bklgPrintTable(table, stdout); } else { char buffer[32]; struct tm *tm; time_t utime = time(0); tm = localtime(&utime); strftime(buffer, 32, "%d/%m/%Y\n", tm); puts(buffer); bklgPrintAllTables(tableList, stdout); } } else if (options->mode == MODE_ENTRY_ADD && options->tableMode) { //Add table. if (!options->entryName) exitmsg(1, "Name required\n"); if (bklgGetTableExact(tableList, options->entryName)) exitmsg(1, err_dupe_table); puts("Added table"); bklgTableAdd(tableList, options->entryName); modified = 1; } else if (options->mode == MODE_ENTRY_REMOVE && options->tableMode) { //Remove table. if (!options->entryName) exitmsg(1, "Name required\n"); struct table_t *table = bklgGetTable(tableList, options->entryName); if (!table) exitmsg(1, tablestr); printf("Remove \"%s\"? [Y,n]: ", table->name); if (confirm()) { puts("Table removed"); bklgLnodeDestroy(tableList, table->parent); bklgTableDestroy(table); modified = 1; } } else if (options->mode == MODE_ENTRY_ADD) { //Add entry. if (!options->entryName || !options->destinationName) exitmsg(1, "Name and destination required, rating optional\n"); table = bklgGetTable(tableList, options->destinationName); if (!table) exitmsg(1, tablestr); if (bklgGetEntryExact(table->entries, options->entryName)) exitmsg(1, err_dupe); printf("Add entry to \"%s\"? [Y,n]: ", table->name); if (confirm()) { puts("Entry added"); entry = bklgEntryAdd(table->entries, options->entryName, options->rating == -2 ? -1 : options->rating); modified = 1; } } else if (options->mode == MODE_ENTRY_REMOVE) { //Remove entry. if (!options->entryName) exitmsg(1, "Name required, source optional\n"); struct entry_t *entry = 0; if (!options->sourceName) { entry = bklgGetEntryAllTables(tableList, options->entryName, &table); } else { table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); entry = bklgGetEntry(table->entries, options->entryName); } if (!entry) exitmsg(1, entrystr); printf("Remove \"%s\" from \"%s\"? [Y,n]: ", entry->name, table->name); if (confirm()) { puts("Entry removed"); bklgLnodeDestroy(table->entries, entry->parent); free(entry); modified = 1; } } else if (options->mode == MODE_ENTRY_MOVE) { //Move entry to another table. if (!options->entryName || !options->destinationName) exitmsg(1, "Name and destination required, source optional\n"); struct entry_t *oldEntry = 0; struct table_t *sourceTable = 0; if (!options->sourceName) { oldEntry = bklgGetEntryAllTables(tableList, options->entryName, &sourceTable); } else { sourceTable = bklgGetTable(tableList, options->sourceName); if (!sourceTable) exitmsg(1, "Source table not found\n"); oldEntry = bklgGetEntry(sourceTable->entries, options->entryName); } if (!oldEntry) exitmsg(1, entrystr); struct table_t *destTable = bklgGetTable(tableList, options->destinationName); if (!destTable) exitmsg(1, "Destination table not found\n"); if (bklgGetEntryExact(destTable->entries, oldEntry->name)) exitmsg(1, err_dupe); printf("Move \"%s\" from \"%s\" to \"%s\"? [Y,n]: ", oldEntry->name, sourceTable->name, destTable->name); if (confirm()) { puts("Entry moved"); entry = bklgEntryAdd(destTable->entries, oldEntry->name, (options->rating < -1 ? oldEntry->rating : options->rating)); bklgLnodeDestroy(sourceTable->entries, oldEntry->parent); free(oldEntry); modified = 1; } } else if (options->mode == MODE_FIND) { //Find entry. if (!options->entryName) exitmsg(1, "Name required, source optional\n"); if (!options->sourceName) { entry = bklgGetEntryAllTables(tableList, options->entryName, &table); } else { table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); entry = bklgGetEntry(table->entries, options->entryName); } if (entry) { char rating[8]; snprintf(rating, 8, "%i/10", entry->rating); printf("Best match:\n\tName: %s\n\tRating: %s\n\tParent table: %s\n", entry->name, entry->rating == -1 ? "none" : rating, table->name); } else { exitmsg(1, entrystr); } } else if (options->rating != RATING_UNDEFINED) { //Set a rating. if (!options->entryName) exitmsg(1, "Name required, rating and source optional\n"); if (!options->sourceName) { entry = bklgGetEntryAllTables(tableList, options->entryName, &table); } else { table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); entry = bklgGetEntry(table->entries, options->entryName); } if (!entry) exitmsg(1, entrystr); printf("Change rating of \"%s\"? [Y,n]: ", entry->name); if (confirm()) { puts("Changed rating"); entry->rating = options->rating; modified = 1; } } else if (options->mode == MODE_ENTRY_RENAME && options->tableMode) { //Rename table. if (!options->entryName || !options->entryNewName) exitmsg(1, "Name and new name required\n"); table = bklgGetTable(tableList, options->entryName); if (!table) exitmsg(1, tablestr); if (bklgGetTableExact(tableList, options->entryNewName)) exitmsg(1, err_dupe_table); printf("Rename \"%s\"? [Y,n]: ", table->name); if (confirm()) { puts("Renamed table"); char tmp[64]; char *tmpp = 0; strncpy(tmp, options->entryNewName, 64); tmpp = stripWhiteSpace(tmp); strncpy(table->name, tmpp, 64); modified = 1; } } else if (options->mode == MODE_ENTRY_RENAME) { //Rename entry. if (!options->entryName || !options->entryNewName) exitmsg(1, "Name and new name required, source optional\n"); if (!options->sourceName) { entry = bklgGetEntryAllTables(tableList, options->entryName, &table); } else { table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); entry = bklgGetEntry(table->entries, options->entryName); } if (!entry) exitmsg(1, entrystr); if (bklgGetEntryExact(table->entries, options->entryNewName)) exitmsg(1, err_dupe); printf("Rename \"%s\"? [Y,n]: ", entry->name); if (confirm()) { puts("Renamed entry"); char tmp[128]; char *tmpp = 0; strncpy(tmp, options->entryNewName, 128); tmpp = stripWhiteSpace(tmp); strncpy(entry->name, tmpp, 128); modified = 1; } } else if (options->mode == MODE_RANDOM) { //Choose random entry. if (!options->sourceName) exitmsg(1, "Source required\n"); struct table_t *table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); srand(time(0) * getpid()); size_t len = listlen(table->entries); int randomindex = rand() % len; struct lnode_t *current = table->entries->tail; for (int i = 0; i < randomindex; i++) { current = current->next; } entry = current->data; char rating[8]; snprintf(rating, 8, "%i/10", entry->rating); printf("Random entry at index %i out of %zu:\n\tName: %s\n\tRating: %s\n\tParent table: %s\n", randomindex + 1, len, entry->name, entry->rating == -1 ? "none" : rating, table->name); } if (options->searchMode) { //Search various sites for entry. if (!entry && !options->entryName) { exitmsg(1, "Name required, source optional\n"); } else if (!entry) { struct table_t *table = 0; if (!options->sourceName) { entry = bklgGetEntryAllTables(tableList, options->entryName, &table); } else { if (!table) { table = bklgGetTable(tableList, options->sourceName); if (!table) exitmsg(1, tablestr); } entry = bklgGetEntry(table->entries, options->entryName); } if (!entry) exitmsg(1, entrystr); } printf("Searching web for \"%s\"\n", entry->name); webSearch(entry, options->searchMode); } else if (options->mode == MODE_HELP) { //Print usage stuff. puts(help_msg); } if (modified) { if (backup) { char bakpath[256]; snprintf(bakpath, 256, "%s.bak", options->backlog_path); if (rename(options->backlog_path, bakpath) == -1) exitmsg(1, "Failed to rename to '%s': %s\n", bakpath, strerror(errno)); } if (writeTables(tableList, options->backlog_path)) exitmsg(1, "Failed to open '%s' for writing: %s\n", options->backlog_path, strerror(errno)); } exit(0); }