#include <windows.h>
#include <S.h>

static struct _char_int_map{
    char *name;
    int   ival;
}mb_styles[] = {
    {"ABORTRETRYIGNORE", MB_ABORTRETRYIGNORE},
    {"APPLMODAL", MB_APPLMODAL},
    {"DEFBUTTON1", MB_DEFBUTTON1},
    {"DEFBUTTON2", MB_DEFBUTTON2},
    {"DEFBUTTON3", MB_DEFBUTTON3},
    {"ICONASTERISK", MB_ICONASTERISK},
    {"ICONEXCLAMATION", MB_ICONEXCLAMATION},
    {"ICONHAND", MB_ICONHAND},
    {ICONINFORMATION", MB_ICONINFORMATION},
    {"ICONQUESTION", MB_ICONQUESTION},
    {"ICONSTOP", MB_ICONSTOP},
    {"OK", MB_OK"},
    {"OKCANCEL", MB_OKCANCEL},
    {"RETRYCANCEL", MB_RETRYCANCEL},
    {"SYSTEMMODAL", MB_SYSTEMMODAL},
    {"TASKMODAL", MB_TASKMODAL},
    {"YESNO", MB_YESNO},
    {"YESNOCANCEL", MB_YESNOCANCEL},
    {NULL, 0}
};

static struct _char_int_map mb_returns[] = {
    {"ABORT", IDABORT},
    {"CANCEL", IDCANCEL},
    {"IGNORE", IDIGNORE},
    {"NO", IDNO},
    {"OK", IDOK},
    {"RETRY", IDRETRY},
    {"YES", IDYES},
    {NULL, 0},
};

int
FindIntValue (struct _char_int_map map[], char *name)
{
    struct _char_int_map *cur;

    if(cur) for (cur = map; cur->name; cur++){
          if(strcmp (cur->name, name) == 0) return cur->ival;
    }
    return NULL;
}

void
S_MessageBox (char **msg, char **title, char **flags, long *nflags, char **ret)
{
    UINT fuStyle = 0;
    long i;
    int mb_return;
    char **cpp, *cp;

    for(cpp = flags, i = *nflags; i > 0; cpp++, i--){
       fustyle |= (UINT) FindIntValue (mb_styles, *cpp);
    }
    mb_return = MessageBox (NULL, *msg, *title, fuStyle);
    cp = FindStrValue (mb_returns, mb_return);
    *ret = S_strdup (cp ? cp : "");
}
