int main(int argc, char *argv[]){ if(argc == 1) { mkdir(BACKUP_DIRECTORY, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); BackUpFiles(); } else if (strcmp(argv[1],"-r") == 0 || strcmp(argv[1],"--restore") == 0 ) RestoreFiles(); else { printf("Error, invalid arguments.\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
void RestoreProject(PROJECTITEM *project, BOOL loadWA) { int projectVersion; struct xmlNode *root; struct xmlNode *children; struct xmlAttr *attribs; FILE *in; char name[MAX_PATH]; sprintf(name, "%s.cpj", project->realName); in = fopen(name, "r"); if (!in) { ExtendedMessageBox("Load Error", MB_SETFOREGROUND | MB_SYSTEMMODAL, "Project File %s Not Found",project->displayName); strcat(project->displayName, " (unable to load)"); return; } root = xmlReadFile(in); fclose(in); if (!root || !IsNode(root, "CC386PROJECT")) { LoadErr(root, project->displayName); strcat(project->displayName, " (unable to load)"); return; } if (loadWA) { children = root->children; while (children) { if (IsNode(children, "WORKAREA")) { attribs = children->attribs; while (attribs) { if (IsAttrib(attribs, "NAME")) { LoadWorkArea(attribs->value, TRUE); return; } attribs = attribs->next; } } children = children->next; } } children = root->children; while (children) { if (IsNode(children, "VERSION")) { attribs = children->attribs; while (attribs) { if (IsAttrib(attribs, "ID")) projectVersion = atoi(attribs->value); attribs = attribs->next; } } else if (IsNode(children, "TARGET")) { struct xmlNode *settings = children->children; attribs = children->attribs; while (attribs) { if (IsAttrib(attribs, "TITLE")) { strcpy(project->displayName, attribs->value); } attribs = attribs->next; } while (settings) { if (IsNode(settings, "FILES")) { RestoreFiles(settings->children, project, project); } if (IsNode(settings, "PROPERTIES")) { RestoreProps(settings->children, project, project); } settings = settings->next; } } children = children->next; } xmlFree(root); CalculateProjectDepends(project); project->loaded = TRUE; }
static void RestoreFiles(struct xmlNode *input, PROJECTITEM *root, PROJECTITEM *parent) { while (input) { if (IsNode(input, "FOLDER")) { struct xmlAttr *attribs = input->attribs; PROJECTITEM *folder = calloc(1, sizeof(PROJECTITEM)); if (folder) { PROJECTITEM **ins = &parent->children; while (attribs) { if (IsAttrib(attribs, "TITLE")) { strcpy(folder->displayName, attribs->value); } attribs = attribs->next; } while (*ins && (*ins)->type == PJ_FOLDER && stricmp((*ins)->displayName, folder->displayName) < 0) ins = &(*ins)->next; folder->parent = parent; folder->type = PJ_FOLDER; folder->next = *ins; *ins = folder; RestoreFiles(input->children, root, folder); } } else if (IsNode(input, "FILE")) { struct xmlAttr *attribs = input->attribs; PROJECTITEM *file = calloc(1, sizeof(PROJECTITEM)); if (file) { PROJECTITEM **ins = &parent->children; while (attribs) { if (IsAttrib(attribs, "TITLE")) { strcpy(file->displayName, attribs->value); } else if (IsAttrib(attribs, "NAME")) { strcpy(file->realName, attribs->value); abspath(file->realName, root->realName); } else if (IsAttrib(attribs, "CLEAN")) { file->clean = atoi(attribs->value); } attribs = attribs->next; } while (*ins && (*ins)->type == PJ_FOLDER) ins = &(*ins)->next; while (*ins && stricmp((*ins)->displayName, file->displayName) < 0) ins = &(*ins)->next; file->parent = parent; file->type = PJ_FILE; file->next = *ins; *ins = file; RestorePropsNested(input->children, root, file); } } input = input->next; } }