#include "../xt/xt.h"
#include <X11/AsciiText.h>

static SYMDESCR Edittype_Syms[] = {
    { "text-read",     XttextRead },
    { "text-append",   XttextAppend },
    { "text-edit",     XttextEdit },
    { 0, 0 }
};
static SYMDESCR Options_Syms[] = {
    { "word-break",         wordBreak },
    { "scroll-vertical",    scrollVertical },
    { "scroll-horizontal",  scrollHorizontal },
    { "scroll-on-overflow", scrollOnOverflow },
    { "resize-width",       resizeWidth },
    { "resize-height",      resizeHeight },
    { "editable",           editable },
    { 0, 0 }
};

static XtArgVal C_Ascii_String_EditType (x) Object x; {
   return (XtArgVal)Symbols_To_Bits (x, 0, Edittype_Syms);
}

static XtArgVal C_Ascii_Disk_EditType (x) Object x; {
   return (XtArgVal)Symbols_To_Bits (x, 0, Edittype_Syms);
}

static XtArgVal C_Ascii_String_TextOptions (x) Object x; {
   return (XtArgVal)Symbols_To_Bits (x, 1, Options_Syms);
}

static XtArgVal C_Ascii_Disk_TextOptions (x) Object x; {
   return (XtArgVal)Symbols_To_Bits (x, 1, Options_Syms);
}

static Object S_Ascii_String_TextOptions (x) XtArgVal x; {
   return Bits_To_Symbols ((unsigned long)x, 1, Options_Syms);
}

static Object S_Ascii_Disk_TextOptions (x) XtArgVal x; {
   return Bits_To_Symbols ((unsigned long)x, 1, Options_Syms);
}

static XtArgVal C_Ascii_String_String (x) Object x; {
   char *s, *t;
    Make_C_String (x, t);
    if ((s = XtMalloc (1024)) == 0)
	Primitive_Error ("out of memory");
    strncpy (s, t, 1024);
    return (XtArgVal)s;
}

static XtArgVal C_Ascii_String_Length (x) Object x; {
   if (Get_Integer (x) > 1024)
	Primitive_Error ("invalid length for ascii-string");
    return (XtArgVal)Get_Integer (x);
}

init_ascii () {
    XtResourceList r = 0;
    r = (XtResourceList)XtMalloc (3 * sizeof (XtResource));
    r[0].resource_name = "font";
    r[0].resource_class = "Font";
    r[0].resource_type = "FontStruct";
    r[1].resource_name = "foreground";
    r[1].resource_class = "Foreground";
    r[1].resource_type = "Pixel";
    r[2].resource_name = "editType";
    r[2].resource_class = "EditType";
    r[2].resource_type = "EditMode";
    Define_Class ("ascii-disk", asciiDiskWidgetClass, r, 3);
    r = (XtResourceList)XtMalloc (4 * sizeof (XtResource));
    r[0].resource_name = "font";
    r[0].resource_class = "Font";
    r[0].resource_type = "FontStruct";
    r[1].resource_name = "foreground";
    r[1].resource_class = "Foreground";
    r[1].resource_type = "Pixel";
    r[2].resource_name = "editType";
    r[2].resource_class = "EditType";
    r[2].resource_type = "EditMode";
    r[3].resource_name = "length";
    r[3].resource_class = "Length";
    r[3].resource_type = "Int";
    Define_Class ("ascii-string", asciiStringWidgetClass, r, 4);
    Define_Converter_To_C ("ascii-string-length", C_Ascii_String_Length);
    Define_Converter_To_C ("ascii-string-string", C_Ascii_String_String);
    Define_Converter_To_Scheme ("ascii-disk-textOptions", S_Ascii_Disk_TextOptions);
    Define_Converter_To_Scheme ("ascii-string-textOptions", S_Ascii_String_TextOptions);
    Define_Converter_To_C ("ascii-disk-textOptions", C_Ascii_Disk_TextOptions);
    Define_Converter_To_C ("ascii-string-textOptions", C_Ascii_String_TextOptions);
    Define_Converter_To_C ("ascii-disk-editType", C_Ascii_Disk_EditType);
    Define_Converter_To_C ("ascii-string-editType", C_Ascii_String_EditType);
}
