/** * @brief Removes a diff. * * @param diff Diff to remove. * @return 0 on success. */ static int diff_removeDiff( UniDiff_t *diff ) { int i; UniHunk_t hunk; for (i=0; i<diff->napplied; i++) { hunk = diff->applied[i]; /* Invert the type for reverting. */ switch (hunk.type) { case HUNK_TYPE_ASSET_ADD: hunk.type = HUNK_TYPE_ASSET_REMOVE; break; case HUNK_TYPE_ASSET_REMOVE: hunk.type = HUNK_TYPE_ASSET_ADD; break; case HUNK_TYPE_ASSET_BLACKMARKET: hunk.type = HUNK_TYPE_ASSET_LEGALMARKET; break; case HUNK_TYPE_ASSET_LEGALMARKET: hunk.type = HUNK_TYPE_ASSET_BLACKMARKET; break; case HUNK_TYPE_JUMP_ADD: hunk.type = HUNK_TYPE_JUMP_REMOVE; break; case HUNK_TYPE_JUMP_REMOVE: hunk.type = HUNK_TYPE_JUMP_ADD; break; case HUNK_TYPE_TECH_ADD: hunk.type = HUNK_TYPE_TECH_REMOVE; break; case HUNK_TYPE_TECH_REMOVE: hunk.type = HUNK_TYPE_TECH_ADD; break; case HUNK_TYPE_ASSET_FACTION: hunk.type = HUNK_TYPE_ASSET_FACTION_REMOVE; break; default: WARN("Unknown Hunk type '%d'.", hunk.type); continue; } if (diff_patchHunk(&hunk)) WARN("Failed to remove hunk type '%d'.", hunk.type); } diff_cleanup(diff); diff_nstack--; i = diff - diff_stack; memmove(&diff_stack[i], &diff_stack[i+1], sizeof(UniDiff_t) * (diff_nstack-i)); return 0; }
/** * @brief Patches a asset. * * @param diff Diff that is doing the patching. * @param node Node containing the asset. * @return 0 on success. */ static int diff_patchAsset( UniDiff_t *diff, xmlNodePtr node ) { UniHunk_t base, hunk; xmlNodePtr cur; /* Set the target. */ memset(&base, 0, sizeof(UniHunk_t)); base.target.type = HUNK_TARGET_ASSET; xmlr_attr(node,"name",base.target.u.name); if (base.target.u.name==NULL) { WARN(_("Unidiff '%s' has an target node without a 'name' tag"), diff->name); return -1; } /* Now parse the possible changes. */ cur = node->xmlChildrenNode; do { xml_onlyNodes(cur); if (xml_isNode(cur,"faction")) { hunk.target.type = base.target.type; hunk.target.u.name = strdup(base.target.u.name); /* Outfit type is constant. */ hunk.type = HUNK_TYPE_ASSET_FACTION; /* Get the data. */ hunk.u.name = xml_getStrd(cur); /* Apply diff. */ if (diff_patchHunk( &hunk ) < 0) diff_hunkFailed( diff, &hunk ); else diff_hunkSuccess( diff, &hunk ); continue; } WARN(_("Unidiff '%s' has unknown node '%s'."), diff->name, node->name); } while (xml_nextNode(cur)); /* Clean up some stuff. */ free(base.target.u.name); base.target.u.name = NULL; return 0; }
/** * @brief Patches a faction. * * @param diff Diff that is doing the patching. * @param node Node containing the asset. * @return 0 on success. */ static int diff_patchFaction( UniDiff_t *diff, xmlNodePtr node ) { UniHunk_t base, hunk; xmlNodePtr cur; char *buf; /* Set the target. */ memset(&base, 0, sizeof(UniHunk_t)); base.target.type = HUNK_TARGET_FACTION; xmlr_attr(node,"name",base.target.u.name); if (base.target.u.name==NULL) { WARN(_("Unidiff '%s' has an target node without a 'name' tag"), diff->name); return -1; } /* Now parse the possible changes. */ cur = node->xmlChildrenNode; do { xml_onlyNodes(cur); if (xml_isNode(cur,"visible")) { hunk.target.type = base.target.type; hunk.target.u.name = strdup(base.target.u.name); /* Faction type is constant. */ hunk.type = HUNK_TYPE_FACTION_VISIBLE; /* There is no name. */ hunk.u.name = NULL; /* Apply diff. */ if (diff_patchHunk( &hunk ) < 0) diff_hunkFailed( diff, &hunk ); else diff_hunkSuccess( diff, &hunk ); continue; } else if (xml_isNode(cur,"invisible")) { hunk.target.type = base.target.type; hunk.target.u.name = strdup(base.target.u.name); /* Faction type is constant. */ hunk.type = HUNK_TYPE_FACTION_INVISIBLE; /* There is no name. */ hunk.u.name = NULL; /* Apply diff. */ if (diff_patchHunk( &hunk ) < 0) diff_hunkFailed( diff, &hunk ); else diff_hunkSuccess( diff, &hunk ); continue; } else if (xml_isNode(cur,"faction")) { hunk.target.type = base.target.type; hunk.target.u.name = strdup(base.target.u.name); /* Get the faction to set the association of. */ xmlr_attr(cur,"name",hunk.u.name); /* Get the type. */ buf = xml_get(cur); if (buf==NULL) { WARN(_("Unidiff '%s': Null hunk type."), diff->name); continue; } if (strcmp(buf,"ally")==0) hunk.type = HUNK_TYPE_FACTION_ALLY; else if (strcmp(buf,"enemy")==0) hunk.type = HUNK_TYPE_FACTION_ENEMY; else if (strcmp(buf,"neutral")==0) hunk.type = HUNK_TYPE_FACTION_NEUTRAL; else WARN(_("Unidiff '%s': Unknown hunk type '%s' for faction '%s'."), diff->name, buf, hunk.u.name); /* Apply diff. */ if (diff_patchHunk( &hunk ) < 0) diff_hunkFailed( diff, &hunk ); else diff_hunkSuccess( diff, &hunk ); continue; } WARN(_("Unidiff '%s' has unknown node '%s'."), diff->name, node->name); } while (xml_nextNode(cur)); /* Clean up some stuff. */ free(base.target.u.name); base.target.u.name = NULL; return 0; }
/** * @brief Patches a system. * * @param diff Diff that is doing the patching. * @param node Node containing the system. * @return 0 on success. */ static int diff_patchSystem( UniDiff_t *diff, xmlNodePtr node ) { UniHunk_t base, hunk; xmlNodePtr cur; char *buf; /* Set the target. */ memset(&base, 0, sizeof(UniHunk_t)); base.target.type = HUNK_TARGET_SYSTEM; xmlr_attr(node,"name",base.target.u.name); if (base.target.u.name==NULL) { WARN(_("Unidiff '%s' has a system node without a 'name' tag, not applying."), diff->name); return -1; } /* Now parse the possible changes. */ cur = node->xmlChildrenNode; do { xml_onlyNodes(cur); if (xml_isNode(cur,"asset")) { hunk.target.type = base.target.type; hunk.target.u.name = strdup(base.target.u.name); /* Get the asset to modify. */ xmlr_attr(cur,"name",hunk.u.name); /* Get the type. */ buf = xml_get(cur); if (buf==NULL) { WARN(_("Unidiff '%s': Null hunk type."), diff->name); continue; } if (strcmp(buf,"add")==0) hunk.type = HUNK_TYPE_ASSET_ADD; else if (strcmp(buf,"remove")==0) hunk.type = HUNK_TYPE_ASSET_REMOVE; else if (strcmp(buf,"blackmarket")==0) hunk.type = HUNK_TYPE_ASSET_BLACKMARKET; else if (strcmp(buf,"legalmarket")==0) hunk.type = HUNK_TYPE_ASSET_LEGALMARKET; else WARN(_("Unidiff '%s': Unknown hunk type '%s' for asset '%s'."), diff->name, buf, hunk.u.name); /* Apply diff. */ if (diff_patchHunk( &hunk ) < 0) diff_hunkFailed( diff, &hunk ); else diff_hunkSuccess( diff, &hunk ); continue; } else if (xml_isNode(cur,"jump")) { hunk.target.type = base.target.type; hunk.target.u.name = strdup(base.target.u.name); /* Get the jump point to modify. */ xmlr_attr(cur,"target",hunk.u.name); /* Get the type. */ buf = xml_get(cur); if (buf==NULL) { WARN(_("Unidiff '%s': Null hunk type."), diff->name); continue; } if (strcmp(buf,"add")==0) hunk.type = HUNK_TYPE_JUMP_ADD; else if (strcmp(buf,"remove")==0) hunk.type = HUNK_TYPE_JUMP_REMOVE; else WARN(_("Unidiff '%s': Unknown hunk type '%s' for jump '%s'."), diff->name, buf, hunk.u.name); hunk.node = cur; /* Apply diff. */ if (diff_patchHunk( &hunk ) < 0) diff_hunkFailed( diff, &hunk ); else diff_hunkSuccess( diff, &hunk ); continue; } WARN(_("Unidiff '%s' has unknown node '%s'."), diff->name, node->name); } while (xml_nextNode(cur)); /* Clean up some stuff. */ free(base.target.u.name); base.target.u.name = NULL; return 0; }