static int Paug_setm(lua_State *L) { augeas *a = Paug_checkarg(L, 1); const char *base = luaL_checkstring(L, 2); const char *sub= luaL_checkstring(L, 3); const char *value = lua_isnil(L, 4) ? NULL : luaL_checkstring(L, 4); return pushresult(L, aug_setm(a, base, sub, value), a, NULL); }
/* * call-seq: * setm(BASE, SUB, VALUE) -> boolean * * Set multiple nodes in one operation. Find or create a node matching * SUB by interpreting SUB as a path expression relative to each node * matching BASE. SUB may be NULL, in which case all the nodes matching * BASE will be modified. */ VALUE augeas_setm(VALUE s, VALUE base, VALUE sub, VALUE value) { augeas *aug = aug_handle(s); const char *cbase = StringValueCStr(base) ; const char *csub = StringValueCStrOrNull(sub) ; const char *cvalue = StringValueCStrOrNull(value) ; int callValue = aug_setm(aug, cbase, csub, cvalue) ; return INT2FIX(callValue); }
static void testSetM(CuTest *tc) { int r; struct augeas *aug; aug = aug_init(root, loadpath, AUG_NO_STDINC|AUG_NO_LOAD); CuAssertPtrNotNull(tc, aug); CuAssertIntEquals(tc, AUG_NOERROR, aug_error(aug)); /* Change base nodes when SUB is NULL */ r = aug_setm(aug, "/augeas/version/save/*", NULL, "changed"); CuAssertIntEquals(tc, 4, r); r = aug_match(aug, "/augeas/version/save/*[. = 'changed']", NULL); CuAssertIntEquals(tc, 4, r); /* Only change existing nodes */ r = aug_setm(aug, "/augeas/version/save", "mode", "again"); CuAssertIntEquals(tc, 4, r); r = aug_match(aug, "/augeas/version/save/*", NULL); CuAssertIntEquals(tc, 4, r); r = aug_match(aug, "/augeas/version/save/*[. = 'again']", NULL); CuAssertIntEquals(tc, 4, r); /* Create a new node */ r = aug_setm(aug, "/augeas/version/save", "mode[last() + 1]", "newmode"); CuAssertIntEquals(tc, 1, r); r = aug_match(aug, "/augeas/version/save/*", NULL); CuAssertIntEquals(tc, 5, r); r = aug_match(aug, "/augeas/version/save/*[. = 'again']", NULL); CuAssertIntEquals(tc, 4, r); r = aug_match(aug, "/augeas/version/save/*[last()][. = 'newmode']", NULL); CuAssertIntEquals(tc, 1, r); /* Noexistent base */ r = aug_setm(aug, "/augeas/version/save[last()+1]", "mode", "newmode"); CuAssertIntEquals(tc, 0, r); /* Invalid path expressions */ r = aug_setm(aug, "/augeas/version/save[]", "mode", "invalid"); CuAssertIntEquals(tc, -1, r); r = aug_setm(aug, "/augeas/version/save/*", "mode[]", "invalid"); CuAssertIntEquals(tc, -1, r); aug_close(aug); }