Beispiel #1
0
static bool memberequals_settingspair(void* pmember, const void* needle) {
    char* str = *(char**)pmember;
    const SettingsPair* pair = (const SettingsPair*) needle;
    if (pair->type == HS_Int) {
        return pair->value.i == atoi(str);
    } else if (pair->type == HS_Compatiblity) {
        HSAttribute* attr = hsattribute_parse_path(pair->value.compat.read);
        GString* attr_str = hsattribute_to_string(attr);
        int equals = !strcmp(attr_str->str, str);
        g_string_free(attr_str, true);
        return equals;
    } else {
        return !strcmp(pair->value.str->str, str);
    }
}
Beispiel #2
0
int substitute_command(int argc, char* argv[], GString* output) {
    // usage: substitute identifier attribute command [args ...]
    //            0         1           2       3
    if (argc < 4) {
        return HERBST_NEED_MORE_ARGS;
    }
    char* identifier = argv[1];
    HSAttribute* attribute = hsattribute_parse_path_verbose(argv[2], output);
    if (!attribute) {
        return HERBST_INVALID_ARGUMENT;
    }
    GString* attribute_string = hsattribute_to_string(attribute);
    char* repl = attribute_string->str;

    (void) SHIFT(argc, argv); // remove command name
    (void) SHIFT(argc, argv); // remove identifier
    (void) SHIFT(argc, argv); // remove attribute

    int status = call_command_substitute(identifier, repl, argc, argv, output);
    g_string_free(attribute_string, true);
    return status;
}
Beispiel #3
0
int settings_get(int argc, char** argv, GString* output) {
    if (argc < 2) {
        return HERBST_NEED_MORE_ARGS;
    }
    SettingsPair* pair = settings_find(argv[1]);
    if (!pair) {
        g_string_append_printf(output,
            "%s: Setting \"%s\" not found\n", argv[0], argv[1]);
        return HERBST_SETTING_NOT_FOUND;
    }
    if (pair->type == HS_Int) {
        g_string_append_printf(output, "%d", pair->value.i);
    } else if (pair->type == HS_String) {
        g_string_append(output, pair->value.str->str);
    } else if (pair->type == HS_Compatiblity) {
        HSAttribute* attr = hsattribute_parse_path(pair->value.compat.read);
        GString* str = hsattribute_to_string(attr);
        g_string_append(output, str->str);
        g_string_free(str, true);
    }
    return 0;
}
Beispiel #4
0
int sprintf_command(int argc, char* argv[], GString* output) {
    // usage: sprintf IDENTIFIER FORMAT [Params...] COMMAND [ARGS ...]
    if (argc < 4) {
        return HERBST_NEED_MORE_ARGS;
    }
    char* identifier = argv[1];
    char* format = argv[2];
    (void) SHIFT(argc, argv);
    (void) SHIFT(argc, argv);
    (void) SHIFT(argc, argv);
    GString* repl = g_string_new("");
    int nextarg = 0; // next argument to consider
    for (int i = 0; format[i] != '\0'; i++) {
        if (format[i] == FORMAT_CHAR) {
            // FORMAT_CHAR is our format character
            // '%' is the printf format character
            switch (format[i+1]) {
                case FORMAT_CHAR:
                    g_string_append(repl, "%%");
                    break;

                case 's':
                    if (nextarg >= (argc - 1)) {
                        g_string_append_printf(output,
                            "Error: Too few parameters. A %dth parameter missing. "
                            "(treating \"%s\" as the command to execute)\n",
                            nextarg, argv[argc - 1]);
                        g_string_free(repl, true);
                        return HERBST_INVALID_ARGUMENT;
                    }
                    HSAttribute* attr;
                    attr = hsattribute_parse_path_verbose(argv[nextarg], output);
                    if (!attr) {
                        g_string_free(repl, true);
                        return HERBST_INVALID_ARGUMENT;
                    }
                    GString* gs = hsattribute_to_string(attr);
                    g_string_append(repl, gs->str);
                    g_string_free(gs, true);
                    nextarg++;
                    break;

                default:
                    g_string_append_printf(output,
                        "Error: unknown format specifier \'%c\' in format "
                        "\"%s\" at position %d\n",
                        format[i+1] ? format[i+1] : '?', format, i);
                    g_string_free(repl, true);
                    return HERBST_INVALID_ARGUMENT;
                    break;
            }
            i++;
        } else {
            g_string_append_c(repl, format[i]);
        }
    }
    int cmdc = argc - nextarg;
    char** cmdv = argv + nextarg;
    int status;
    status = call_command_substitute(identifier, repl->str, cmdc, cmdv, output);
    g_string_free(repl, true);
    return status;
}