Search code examples
cvariadic-functions

Passing variable argument to another function


I need to pass variable argument to another function. The problem is that this argument is an function and i have no idea how to determine the type of funtion. For example i have function: char(*)char(c), how to read it by va_arg?

void process(const char* typ ...)
{
    char c;
    va_list ap;
    
    va_start(ap, typ);

    while (*typ != 0)
    {
        switch (*typ)
        {
            case'p':
                //change(va_arg(ap, char*), va_arg(ap, char(*)char(c)));
            case 'f':
                //filterr(va_arg(ap, char*), va_arg(ap, bool(*)char));
            case 's':
                char* a = va_arg(ap, char*);
                char* b = va_arg(ap, char*);
                encrypt(a, b);
                break;
        }
    }
}

char changeToUppear(char c) {
    return (c >= 'a' and c <= 'z') ? c - 32 : c;
}
bool leaveLowercase(char c) {
    return (c < 'a' or c>'z');
}



Solution

  • char(*)char(c), how to read it by va_arg?

    Just take it, like any other type. The function type is char (*)(char). After correcting many typos in your code, the following compiles:

    #include <iso646.h>
    #include <stdio.h>
    #include <stdarg.h>
    #include <stdbool.h>
    void change(char (*func)(char), char *pnt);
    char filterr(bool (*func)(char), char *pnt);
    void encrypt(char *, char*);
    
    void process(const char* typ, ...) {
    //                          ^ !!
        char c;
        va_list ap;   
        va_start(ap, typ);
        while (*typ != 0) {
            switch (*typ) {
                case'p': {
                    char *pnt = va_arg(ap, char*);
                    char (*func)(char) = va_arg(ap, char (*)(char));
                    change(pnt, func);
                }
                    break;
                case 'f': {
                    char *pnt = va_arg(ap, char*);
                    bool (*func)(char) = va_arg(ap, bool (*)(char));
                    filterr(pnt, func);
                }
                    break;
                case 's': {
                    char* a = va_arg(ap, char*); // it's not possible to declare variable after case!
                    char* b = va_arg(ap, char*);
                    encrypt(a, b);
                }
                    break;
            }
        }
        va_end(ap); // remember about va_end!
    }
    
    char changeToUppear(char c) {
        // prefer toupper from ctype.h
        return (c >= 'a' and c <= 'z') ? c - 32 : c;
    }
    bool leaveLowercase(char c) {
        // prefer islower() != 0 from ctype.h
        return (c < 'a' or c>'z');
    }
    
    int main() 
    {
        char s1[] = "Ala ma kota.";
        char s2[] = "Kot ma Ale!";
        char s3[] = "to jest bardzo tajny tekst";
        process("pfs",s1,changeToUppear,s2,leaveLowercase,s3,"TAJNE");
    }