cpp_dialect.c   [plain text]


#include <string.h> // strcmp()

#include "cpp_dialect.h"

int dcc_seen_opt_x = 0;
char *dcc_opt_x_ext = NULL;

struct assoc_t;
struct assoc_t
{
  char *key;
  char *val;
};
typedef struct assoc_t assoc_t;

static assoc_t dialect_tbl[] =
{
    { "c",             "cpp-output",        }, /**/
    { "c++",           "c++-cpp-output",    },
    { "objective-c",   "objc-cpp-output",   }, /**/
    { "objective-c++", "objc++-cpp-output", }, /**/

    { NULL, NULL }
};

static assoc_t ext_tbl[] =
{
    { "c",                 ".i"   }, /**/
    { "cpp-output",        ".i"   }, /**/

    { "c++",               ".ii"  },
    { "c++-cpp-output",    ".ii"  },

    { "objective-c",       ".mi"  }, /**/
    { "objc-cpp-output",   ".mi"  }, /**/

    { "objective-c++",     ".mii" }, /**/
    { "objc++-cpp-output", ".mii" }, /**/

    { NULL, NULL }
};

static char *tbl_lookup(assoc_t *tbl, char *key)
{
    int i = 0;
    while (tbl[i].key) {
      if (!strcmp(tbl[i].key, key)) {
            return tbl[i].val;
      }
        i++;
    }
    return NULL;
}

char *dcc_dialect_lookup(char *key)
{
  return tbl_lookup(dialect_tbl, key);
}

char *dcc_ext_lookup(char *key)
{
  return tbl_lookup(ext_tbl, key);
}

void dcc_fix_opt_x(char **argv)
{
    int i;
    for(i = 0; NULL != argv[i]; i++)
    {
        if(!strcmp(argv[i], "-x"))
        {
            char *dialect;
            if(dialect = dcc_dialect_lookup(argv[i + 1]))
            {
                argv[i + 1] = dialect;
            }
        }
    }
    return;
}