/** * @brief Checks to see if a diff is currently applied. * * @luatparam string name Name of the diff to check. * @luatreturn boolean true if diff is applied, false if it isn't. * @luafunc isApplied( name ) */ static int diff_isappliedL( lua_State *L ) { const char *name; name = luaL_checkstring(L,1); lua_pushboolean(L,diff_isApplied(name)); return 1; }
/** * @brief Applies a diff to the universe. * * @param name Diff to apply. * @return 0 on success. */ int diff_apply( const char *name ) { xmlNodePtr node; xmlDocPtr doc; size_t bufsize; char *buf; char *diffname; /* Check if already applied. */ if (diff_isApplied(name)) return 0; buf = ndata_read( DIFF_DATA_PATH, &bufsize ); doc = xmlParseMemory( buf, bufsize ); node = doc->xmlChildrenNode; if (strcmp((char*)node->name,"unidiffs")) { ERR(_("Malformed unidiff file: missing root element 'unidiffs'")); return 0; } node = node->xmlChildrenNode; /* first system node */ if (node == NULL) { ERR(_("Malformed unidiff file: does not contain elements")); return 0; } do { if (xml_isNode(node,"unidiff")) { /* Check to see if it's the diff we're looking for. */ xmlr_attr(node,"name",diffname); if (strcmp(diffname,name)==0) { /* Apply it. */ diff_patch( node ); /* Clean up. */ free(diffname); xmlFreeDoc(doc); free(buf); economy_execQueued(); return 0; } free(diffname); } } while (xml_nextNode(node)); /* More clean up. */ xmlFreeDoc(doc); free(buf); WARN(_("UniDiff '%s' not found in %s."), name, DIFF_DATA_PATH); return -1; }