Update to new Glk 0.7.2 code
[projects/chimara/chimara.git] / libchimara / gi_dispa.c
index b3ac0bc5f78529f9eb15a42d892c4b4ce89839c9..4c4b5537bfc63d179655db35a2bd14d9b6a2704a 100644 (file)
@@ -1,8 +1,8 @@
-/* gi_dispa.c: Dispatch layer for Glk API, version 0.7.0.
+/* gi_dispa.c: Dispatch layer for Glk API, version 0.7.2.
     Designed by Andrew Plotkin <erkyrath@eblong.com>
-    http://www.eblong.com/zarf/glk/index.html
+    http://eblong.com/zarf/glk/
 
-    This file is copyright 1998-2004 by Andrew Plotkin. You may copy,
+    This file is copyright 1998-2011 by Andrew Plotkin. You may copy,
     distribute, and incorporate it into your own programs, by any means
     and under any conditions, as long as you do not modify it. You may
     also modify this file, incorporate it into your own programs,
@@ -49,10 +49,12 @@ static gidispatch_intconst_t intconstant_table[] = {
     { "evtype_Redraw", (6) },
     { "evtype_SoundNotify", (7) },
     { "evtype_Timer", (1) },
+
     { "filemode_Read", (0x02) },
     { "filemode_ReadWrite", (0x03) },
     { "filemode_Write", (0x01) },
     { "filemode_WriteAppend", (0x05) },
+
     { "fileusage_BinaryMode", (0x000) },
     { "fileusage_Data", (0x00) },
     { "fileusage_InputRecord", (0x03) },
@@ -60,17 +62,22 @@ static gidispatch_intconst_t intconstant_table[] = {
     { "fileusage_TextMode",   (0x100) },
     { "fileusage_Transcript", (0x02) },
     { "fileusage_TypeMask", (0x0f) },
+
     { "gestalt_CharInput", (1) },
     { "gestalt_CharOutput", (3) },
     { "gestalt_CharOutput_ApproxPrint", (1) },
     { "gestalt_CharOutput_CannotPrint", (0) },
     { "gestalt_CharOutput_ExactPrint", (2) },
+    { "gestalt_DateTime", (20) },
     { "gestalt_DrawImage", (7) },
     { "gestalt_Graphics", (6) },
     { "gestalt_GraphicsTransparency", (14) },
     { "gestalt_HyperlinkInput", (12) },
     { "gestalt_Hyperlinks", (11) },
     { "gestalt_LineInput", (2) },
+    { "gestalt_LineInputEcho", (17) },
+    { "gestalt_LineTerminatorKey", (19) },
+    { "gestalt_LineTerminators", (18) },
     { "gestalt_MouseInput", (4) },
     { "gestalt_Sound", (8) },
     { "gestalt_SoundMusic", (13) },
@@ -78,14 +85,15 @@ static gidispatch_intconst_t intconstant_table[] = {
     { "gestalt_SoundVolume", (9) },
     { "gestalt_Timer", (5) },
     { "gestalt_Unicode", (15) },
+    { "gestalt_UnicodeNorm", (16) },
     { "gestalt_Version", (0) },
-#ifdef GLK_MODULE_IMAGE
+
     { "imagealign_InlineCenter",  (0x03) },
     { "imagealign_InlineDown",  (0x02) },
     { "imagealign_MarginLeft",  (0x04) },
     { "imagealign_MarginRight",  (0x05) },
     { "imagealign_InlineUp",  (0x01) },
-#endif /* GLK_MODULE_IMAGE */
+
     { "keycode_Delete",   (0xfffffff9) },
     { "keycode_Down",     (0xfffffffb) },
     { "keycode_End",      (0xfffffff3) },
@@ -112,9 +120,11 @@ static gidispatch_intconst_t intconstant_table[] = {
     { "keycode_Tab",      (0xfffffff7) },
     { "keycode_Unknown",  (0xffffffff) },
     { "keycode_Up",       (0xfffffffc) },
+
     { "seekmode_Current", (1) },
     { "seekmode_End", (2) },
     { "seekmode_Start", (0) },
+
     { "style_Alert", (5) },
     { "style_BlockQuote", (7) },
     { "style_Emphasized", (1) },
@@ -142,14 +152,19 @@ static gidispatch_intconst_t intconstant_table[] = {
     { "stylehint_just_LeftFlush", (0) },
     { "stylehint_just_LeftRight", (1) },
     { "stylehint_just_RightFlush", (3) },
+
     { "winmethod_Above", (0x02)  },
     { "winmethod_Below", (0x03)  },
+    { "winmethod_Border", (0x000)  },
+    { "winmethod_BorderMask", (0x100)  },
     { "winmethod_DirMask", (0x0f) },
     { "winmethod_DivisionMask", (0xf0) },
     { "winmethod_Fixed", (0x10) },
     { "winmethod_Left",  (0x00)  },
+    { "winmethod_NoBorder", (0x100)  },
     { "winmethod_Proportional", (0x20) },
     { "winmethod_Right", (0x01)  },
+
     { "wintype_AllTypes", (0)  },
     { "wintype_Blank", (2)  },
     { "wintype_Graphics", (5)  },
@@ -270,6 +285,28 @@ static gidispatch_function_t function_table[] = {
     { 0x0140, glk_request_char_event_uni, "request_char_event_uni" },
     { 0x0141, glk_request_line_event_uni, "request_line_event_uni" },
 #endif /* GLK_MODULE_UNICODE */
+#ifdef GLK_MODULE_UNICODE_NORM
+    { 0x0123, glk_buffer_canon_decompose_uni, "buffer_canon_decompose_uni" },
+    { 0x0124, glk_buffer_canon_normalize_uni, "buffer_canon_normalize_uni" },
+#endif /* GLK_MODULE_UNICODE_NORM */
+#ifdef GLK_MODULE_LINE_ECHO
+    { 0x0150, glk_set_echo_line_event, "set_echo_line_event" },
+#endif /* GLK_MODULE_LINE_ECHO */
+#ifdef GLK_MODULE_LINE_TERMINATORS
+    { 0x0151, glk_set_terminators_line_event, "set_terminators_line_event" },
+#endif /* GLK_MODULE_LINE_TERMINATORS */
+#ifdef GLK_MODULE_DATETIME
+    { 0x0160, glk_current_time, "current_time" },
+    { 0x0161, glk_current_simple_time, "current_simple_time" },
+    { 0x0168, glk_time_to_date_utc, "time_to_date_utc" },
+    { 0x0169, glk_time_to_date_local, "time_to_date_local" },
+    { 0x016A, glk_simple_time_to_date_utc, "simple_time_to_date_utc" },
+    { 0x016B, glk_simple_time_to_date_local, "simple_time_to_date_local" },
+    { 0x016C, glk_date_to_time_utc, "date_to_time_utc" },
+    { 0x016D, glk_date_to_time_local, "date_to_time_local" },
+    { 0x016E, glk_date_to_simple_time_utc, "date_to_simple_time_utc" },
+    { 0x016F, glk_date_to_simple_time_local, "date_to_simple_time_local" },
+#endif /* GLK_MODULE_DATETIME */
 };
 
 glui32 gidispatch_count_classes()
@@ -555,6 +592,46 @@ char *gidispatch_prototype(glui32 funcnum)
             return "3Qa&+#!IuIu:";
 #endif /* GLK_MODULE_UNICODE */
             
+#ifdef GLK_MODULE_UNICODE_NORM
+        case 0x0123: /* buffer_canon_decompose_uni */
+            return "3&+#IuIu:Iu";
+        case 0x0124: /* buffer_canon_normalize_uni */
+            return "3&+#IuIu:Iu";
+#endif /* GLK_MODULE_UNICODE_NORM */
+
+#ifdef GLK_MODULE_LINE_ECHO
+        case 0x0150: /* set_echo_line_event */
+            return "2QaIu:";
+#endif /* GLK_MODULE_LINE_ECHO */
+
+#ifdef GLK_MODULE_LINE_TERMINATORS
+        case 0x0151: /* set_terminators_line_event */
+            return "2Qa>#Iu:";
+#endif /* GLK_MODULE_LINE_TERMINATORS */
+            
+#ifdef GLK_MODULE_DATETIME
+        case 0x0160: /* current_time */
+            return "1<+[3IsIuIs]:";
+        case 0x0161: /* current_simple_time */
+            return "2Iu:Is";
+        case 0x0168: /* time_to_date_utc */
+            return "2>+[3IsIuIs]<+[8IsIsIsIsIsIsIsIs]:";
+        case 0x0169: /* time_to_date_local */
+            return "2>+[3IsIuIs]<+[8IsIsIsIsIsIsIsIs]:";
+        case 0x016A: /* simple_time_to_date_utc */
+            return "3IsIu<+[8IsIsIsIsIsIsIsIs]:";
+        case 0x016B: /* simple_time_to_date_local */
+            return "3IsIu<+[8IsIsIsIsIsIsIsIs]:";
+        case 0x016C: /* date_to_time_utc */
+            return "2>+[8IsIsIsIsIsIsIsIs]<+[3IsIuIs]:";
+        case 0x016D: /* date_to_time_local */
+            return "2>+[8IsIsIsIsIsIsIsIs]<+[3IsIuIs]:";
+        case 0x016E: /* date_to_simple_time_utc */
+            return "3>+[8IsIsIsIsIsIsIsIs]Iu:Is";
+        case 0x016F: /* date_to_simple_time_local */
+            return "3>+[8IsIsIsIsIsIsIsIs]Iu:Is";
+#endif /* GLK_MODULE_DATETIME */
+
         default:
             return NULL;
     }
@@ -1109,7 +1186,245 @@ void gidispatch_call(glui32 funcnum, glui32 numargs, gluniversal_t *arglist)
                     0, arglist[2].uint);
             break;
 #endif /* GLK_MODULE_UNICODE */
+
+#ifdef GLK_MODULE_UNICODE_NORM
+        case 0x0123: /* buffer_canon_decompose_uni */
+            if (arglist[0].ptrflag) 
+                arglist[5].uint = glk_buffer_canon_decompose_uni(arglist[1].array, arglist[2].uint, arglist[3].uint);
+            else
+                arglist[3].uint = glk_buffer_canon_decompose_uni(NULL, 0, arglist[1].uint);
+            break;
+        case 0x0124: /* buffer_canon_normalize_uni */
+            if (arglist[0].ptrflag) 
+                arglist[5].uint = glk_buffer_canon_normalize_uni(arglist[1].array, arglist[2].uint, arglist[3].uint);
+            else
+                arglist[3].uint = glk_buffer_canon_normalize_uni(NULL, 0, arglist[1].uint);
+            break;
+#endif /* GLK_MODULE_UNICODE_NORM */
+            
+#ifdef GLK_MODULE_LINE_ECHO
+        case 0x0150: /* set_echo_line_event */
+            glk_set_echo_line_event(arglist[0].opaqueref, arglist[1].uint);
+            break;
+#endif /* GLK_MODULE_LINE_ECHO */
+
+#ifdef GLK_MODULE_LINE_TERMINATORS
+        case 0x0151: /* set_terminators_line_event */
+            if (arglist[1].ptrflag) 
+                glk_set_terminators_line_event(arglist[0].opaqueref, 
+                    arglist[2].array, arglist[3].uint);
+            else
+                glk_set_terminators_line_event(arglist[0].opaqueref, 
+                    NULL, 0);
+            break;
+#endif /* GLK_MODULE_LINE_TERMINATORS */
             
+#ifdef GLK_MODULE_DATETIME
+        case 0x0160: /* current_time */
+            if (arglist[0].ptrflag) {
+                glktimeval_t dat;
+                glk_current_time(&dat);
+                arglist[1].sint = dat.high_sec;
+                arglist[2].uint = dat.low_sec;
+                arglist[3].sint = dat.microsec;
+            }
+            else {
+                glk_current_time(NULL);
+            }
+            break;
+        case 0x0161: /* current_simple_time */
+            arglist[2].sint = glk_current_simple_time(arglist[0].uint);
+            break;
+        case 0x0168: /* time_to_date_utc */ {
+            glktimeval_t timeval;
+            glktimeval_t *timeptr = NULL;
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            int ix = 0;
+            if (arglist[ix++].ptrflag) {
+                timeptr = &timeval;
+                timeval.high_sec = arglist[ix++].sint;
+                timeval.low_sec = arglist[ix++].uint;
+                timeval.microsec = arglist[ix++].sint;
+            }
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+            }
+            glk_time_to_date_utc(timeptr, dateptr);
+            if (dateptr) {
+                arglist[ix++].sint = date.year;
+                arglist[ix++].sint = date.month;
+                arglist[ix++].sint = date.day;
+                arglist[ix++].sint = date.weekday;
+                arglist[ix++].sint = date.hour;
+                arglist[ix++].sint = date.minute;
+                arglist[ix++].sint = date.second;
+                arglist[ix++].sint = date.microsec;
+            }
+            }
+            break;
+        case 0x0169: /* time_to_date_local */ {
+            glktimeval_t timeval;
+            glktimeval_t *timeptr = NULL;
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            int ix = 0;
+            if (arglist[ix++].ptrflag) {
+                timeptr = &timeval;
+                timeval.high_sec = arglist[ix++].sint;
+                timeval.low_sec = arglist[ix++].uint;
+                timeval.microsec = arglist[ix++].sint;
+            }
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+            }
+            glk_time_to_date_local(timeptr, dateptr);
+            if (dateptr) {
+                arglist[ix++].sint = date.year;
+                arglist[ix++].sint = date.month;
+                arglist[ix++].sint = date.day;
+                arglist[ix++].sint = date.weekday;
+                arglist[ix++].sint = date.hour;
+                arglist[ix++].sint = date.minute;
+                arglist[ix++].sint = date.second;
+                arglist[ix++].sint = date.microsec;
+            }
+            }
+            break;
+        case 0x016A: /* simple_time_to_date_utc */ {
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            int ix = 2;
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+            }
+            glk_simple_time_to_date_utc(arglist[0].sint, arglist[1].uint, dateptr);
+            if (dateptr) {
+                arglist[ix++].sint = date.year;
+                arglist[ix++].sint = date.month;
+                arglist[ix++].sint = date.day;
+                arglist[ix++].sint = date.weekday;
+                arglist[ix++].sint = date.hour;
+                arglist[ix++].sint = date.minute;
+                arglist[ix++].sint = date.second;
+                arglist[ix++].sint = date.microsec;
+            }
+            }
+            break;
+        case 0x016B: /* simple_time_to_date_local */ {
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            int ix = 2;
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+            }
+            glk_simple_time_to_date_local(arglist[0].sint, arglist[1].uint, dateptr);
+            if (dateptr) {
+                arglist[ix++].sint = date.year;
+                arglist[ix++].sint = date.month;
+                arglist[ix++].sint = date.day;
+                arglist[ix++].sint = date.weekday;
+                arglist[ix++].sint = date.hour;
+                arglist[ix++].sint = date.minute;
+                arglist[ix++].sint = date.second;
+                arglist[ix++].sint = date.microsec;
+            }
+            }
+            break;
+        case 0x016C: /* date_to_time_utc */ {
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            glktimeval_t timeval;
+            glktimeval_t *timeptr = NULL;
+            int ix = 0;
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+                date.year = arglist[ix++].sint;
+                date.month = arglist[ix++].sint;
+                date.day = arglist[ix++].sint;
+                date.weekday = arglist[ix++].sint;
+                date.hour = arglist[ix++].sint;
+                date.minute = arglist[ix++].sint;
+                date.second = arglist[ix++].sint;
+                date.microsec = arglist[ix++].sint;
+            }
+            if (arglist[ix++].ptrflag) {
+                timeptr = &timeval;
+            }
+            glk_date_to_time_utc(dateptr, timeptr);
+            if (timeptr) {
+                arglist[ix++].sint = timeval.high_sec;
+                arglist[ix++].uint = timeval.low_sec;
+                arglist[ix++].sint = timeval.microsec;
+            }
+            }
+            break;
+        case 0x016D: /* date_to_time_local */ {
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            glktimeval_t timeval;
+            glktimeval_t *timeptr = NULL;
+            int ix = 0;
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+                date.year = arglist[ix++].sint;
+                date.month = arglist[ix++].sint;
+                date.day = arglist[ix++].sint;
+                date.weekday = arglist[ix++].sint;
+                date.hour = arglist[ix++].sint;
+                date.minute = arglist[ix++].sint;
+                date.second = arglist[ix++].sint;
+                date.microsec = arglist[ix++].sint;
+            }
+            if (arglist[ix++].ptrflag) {
+                timeptr = &timeval;
+            }
+            glk_date_to_time_local(dateptr, timeptr);
+            if (timeptr) {
+                arglist[ix++].sint = timeval.high_sec;
+                arglist[ix++].uint = timeval.low_sec;
+                arglist[ix++].sint = timeval.microsec;
+            }
+            }
+            break;
+        case 0x016E: /* date_to_simple_time_utc */ {
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            int ix = 0;
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+                date.year = arglist[ix++].sint;
+                date.month = arglist[ix++].sint;
+                date.day = arglist[ix++].sint;
+                date.weekday = arglist[ix++].sint;
+                date.hour = arglist[ix++].sint;
+                date.minute = arglist[ix++].sint;
+                date.second = arglist[ix++].sint;
+                date.microsec = arglist[ix++].sint;
+            }
+            arglist[ix+2].sint = glk_date_to_simple_time_utc(dateptr, arglist[ix].uint);
+            }
+            break;
+        case 0x016F: /* date_to_simple_time_local */ {
+            glkdate_t date;
+            glkdate_t *dateptr = NULL;
+            int ix = 0;
+            if (arglist[ix++].ptrflag) {
+                dateptr = &date;
+                date.year = arglist[ix++].sint;
+                date.month = arglist[ix++].sint;
+                date.day = arglist[ix++].sint;
+                date.weekday = arglist[ix++].sint;
+                date.hour = arglist[ix++].sint;
+                date.minute = arglist[ix++].sint;
+                date.second = arglist[ix++].sint;
+                date.microsec = arglist[ix++].sint;
+            }
+            arglist[ix+2].sint = glk_date_to_simple_time_local(dateptr, arglist[ix].uint);
+            }
+            break;
+#endif /* GLK_MODULE_DATETIME */
+
         default:
             /* do nothing */
             break;