Вот быстрое и грязное решение C, которое использует существующие макросы для извлечения правил искажения и печати искаженного результата.Большая часть этого исключается оптимизатором, поэтому существуют только соответствующие случаи.Вы должны быть в состоянии приспособить это к вашему коду.
#include <stdio.h>
#include <string.h>
/* The autoconf macros, predefined here for uppercase, underscore,
* extra underscore */
#define FC_FUNC(name, NAME) NAME ## _
#define FC_FUNC_(name, NAME) NAME ## __
#define STR(arg) STR1(arg)
#define STR1(arg) #arg
int main(int argc, char **argv)
{
const char normal[] = STR(FC_FUNC(l, U));
const char w_uscore[] = STR(FC_FUNC_(l, U));
char ucase, uscore, extra_uscore;
char buf[256];
int i;
ucase = normal[0] == 'l' ? 0 : 1;
if (sizeof(normal) > sizeof("l"))
uscore = 1;
else
uscore = 0;
if (sizeof(w_uscore) > sizeof(normal))
extra_uscore = 1;
else
extra_uscore = 0;
printf("upper: %d uscore: %d extra :%d\n", ucase, uscore, extra_uscore);
if (argc < 2)
return -1;
/* Copy string, converting case */
for (i=0; i < strlen(argv[1]); i++)
{
buf[i] = ucase ? toupper(argv[1][i]) : tolower(argv[1][i]);
}
if (uscore)
buf[i++] = '_';
if (extra_uscore && strchr(argv[1], '_'))
{
buf[i++] = '_';
}
buf[i] = '\0';
printf("old: %s - new %s\n", argv[1], buf);
return 0;
}