aboutsummaryrefslogblamecommitdiffstats
path: root/src/strings.c
blob: 1a211a2956474bbecbf2c56820bf14f1358d1e2b (plain) (tree)


















































                                                



                                                                               

































                               
  
 




















































                                                                           
                                                 

















                                              
                                  
 
      



                                                
                                         
      
                       

 


















                                                   
                                 
 
      
                                                 

                

 













                                                  


                                       
      
                                                
      
 
#include "strings.h"
#include <curses.h>
#include <string.h>

#define lengthof(x) (sizeof(x) / sizeof((x)[0]))

typedef struct _trans {
    const char* str;
    int tag;
} trans;

static trans colors[] = {
    {"black",   COLOR_BLACK},
    {"red",     COLOR_RED},
    {"green",   COLOR_GREEN},
    {"yellow",  COLOR_YELLOW},
    {"blue",    COLOR_BLUE},
    {"magenta", COLOR_MAGENTA},
    {"cyan",    COLOR_CYAN},
    {"white",   COLOR_WHITE},
};

static trans modes[] = {
    {"standout",   A_STANDOUT},
    {"underline",  A_UNDERLINE},
    {"reverse",    A_REVERSE},
    {"blink",      A_BLINK},
    {"dim",        A_DIM},
    {"bold",       A_BOLD},
    {"protect",    A_PROTECT},
    {"invis",      A_INVIS},
    {"altcharset", A_ALTCHARSET},
    {"chartext",   A_CHARTEXT},
};

static trans keys[] = {
    {"left",      KEY_LEFT},
    {"right",     KEY_RIGHT},
    {"up",        KEY_UP},
    {"down",      KEY_DOWN},
    {"home",      KEY_HOME},
    {"end",       KEY_END},
    {"backspace", KEY_BACKSPACE},
    {"enter",     KEY_ENTER},
    {"page down", KEY_NPAGE},
    {"page up",   KEY_PPAGE},
    {"break",     KEY_BREAK},
    {"delete",    KEY_DC},
    {"insert",    KEY_IC},
};

/* XXX: the ACS_ defines are actually just indexes into another internal array,
 * which means that we can't use them as initializers. think of a better way
 * to do this. */
/*
static trans chars[] = {
    {"block",    ACS_BLOCK},
    {"board",    ACS_BOARD},
    {"btee",     ACS_BTEE},
    {"bullet",   ACS_BULLET},
    {"ckboard",  ACS_CKBOARD},
    {"darrow",   ACS_DARROW},
    {"degree",   ACS_DEGREE},
    {"diamond",  ACS_DIAMOND},
    {"gequal",   ACS_GEQUAL},
    {"hline",    ACS_HLINE},
    {"lantern",  ACS_LANTERN},
    {"larrow",   ACS_LARROW},
    {"lequal",   ACS_LEQUAL},
    {"llcorner", ACS_LLCORNER},
    {"lrcorner", ACS_LRCORNER},
    {"ltee",     ACS_LTEE},
    {"nequal",   ACS_NEQUAL},
    {"pi",       ACS_PI},
    {"plminus",  ACS_PLMINUS},
    {"plus",     ACS_PLUS},
    {"rarrow",   ACS_RARROW},
    {"rtee",     ACS_RTEE},
    {"s1",       ACS_S1},
    {"s3",       ACS_S3},
    {"s7",       ACS_S7},
    {"s9",       ACS_S9},
    {"sterling", ACS_STERLING},
    {"ttee",     ACS_TTEE},
    {"uarrow",   ACS_UARROW},
    {"ulcorner", ACS_ULCORNER},
    {"urcorner", ACS_URCORNER},
    {"vline",    ACS_VLINE},
};
*/

static const char* fn_keys[] = {
    "F0",  "F1",  "F2",  "F3",  "F4",  "F5",  "F6",  "F7",
    "F8",  "F9",  "F10", "F11", "F12", "F13", "F14", "F15",
    "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23",
    "F24", "F25", "F26", "F27", "F28", "F29", "F30", "F31",
    "F32", "F33", "F34", "F35", "F36", "F37", "F38", "F39",
    "F40", "F41", "F42", "F43", "F44", "F45", "F46", "F47",
    "F48", "F49", "F50", "F51", "F52", "F53", "F54", "F55",
    "F56", "F57", "F58", "F59", "F60", "F61", "F62", "F63",
};

static int str2enum(const trans table[], int len, const char* str)
{
    int i;

    for (i = 0; i < len; ++i) {
        if (!strcmp(str, table[i].str)) {
            return table[i].tag;
        }
    }

    return -1;
}

static const char* enum2str(const trans* table, int len, int tag)
{
    int i;

    for (i = 0; i < len; ++i) {
        if (tag == table[i].tag) {
            return table[i].str;
        }
    }

    return NULL;
}

static void each_item(const trans* table, int len, table_cb cb, void* data)
{
    int i;

    for (i = 0; i < len; ++i) {
        cb(table[i].str, table[i].tag, data);
    }
}

int get_color_enum(const char* str)
{
    return str2enum(colors, lengthof(colors), str);
}

int get_mode_enum(const char* str)
{
    return str2enum(modes, lengthof(modes), str);
}

int get_key_enum(const char* str)
{
    int ret;

    ret = str2enum(keys, lengthof(keys), str);

    if (ret == -1) {
        int fkey;
        if (sscanf(str, "F%d", &fkey) == 1) {
            return KEY_F(fkey);
        }
    }

    return ret == -1 ? (int)str[0] : ret;
}

int get_char_enum(const char* str)
{
    /*
    int ret;

    ret = str2enum(chars, lengthof(chars), str);

    return ret == -1 ? (int)str[0] : ret;
    */
    return (int)str[0];
}

const char* get_color_str(int tag)
{
    return enum2str(colors, lengthof(colors), tag);
}

const char* get_mode_str(int tag)
{
    return enum2str(modes, lengthof(modes), tag);
}

const char* get_key_str(int tag)
{
    if (tag >= KEY_F(0) && tag <= KEY_F(63)) {
        return fn_keys[tag - KEY_F0];
    }

    return enum2str(keys, lengthof(keys), tag);
}

const char* get_char_str(int tag)
{
    /*
    return enum2str(chars, lengthof(chars), tag);
    */
    return NULL;
}

void each_color(table_cb cb, void* data)
{
    each_item(colors, lengthof(colors), cb, data);
}

void each_mode(table_cb cb, void* data)
{
    each_item(modes, lengthof(modes), cb, data);
}

void each_key(table_cb cb, void* data)
{
    each_item(keys, lengthof(keys), cb, data);
}

void each_char(table_cb cb, void* data)
{
    /*
    each_item(chars, lengthof(chars), cb, data);
    */
}