ncurses 5.7 - patch 20100220
[ncurses.git] / Ada95 / gen / gen.c
index b7842a64a862d45e193f299070a5304f26f2c385..24c0f08715634881ad85d56bb39937a0c5630960 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998,2004,2005 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998,2009,2010 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -32,7 +32,7 @@
 
 /*
     Version Control
-    $Id: gen.c,v 1.40 2005/01/22 17:03:48 tom Exp $
+    $Id: gen.c,v 1.52 2010/02/20 21:59:56 tom Exp $
   --------------------------------------------------------------------------*/
 /*
   This program generates various record structures and constants from the
   to produce the real source.
   */
 
+#ifdef HAVE_CONFIG_H
+#include <ncurses_cfg.h>
+#else
+#include <ncurses.h>
+#define HAVE_USE_DEFAULT_COLORS 1
+#endif
+
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
@@ -69,7 +76,7 @@ find_pos(char *s, unsigned len, int *low, int *high)
   int l = 0;
 
   *high = -1;
-  *low = 8 * len;
+  *low = (int)(8 * len);
 
   for (i = 0; i < len; i++, s++)
     {
@@ -88,9 +95,13 @@ find_pos(char *s, unsigned len, int *low, int *high)
                }
              l++;
              if (little_endian)
-               *s >>= 1;
+               {
+                 *s >>= 1;
+               }
              else
-               *s <<= 1;
+               {
+                 *s = (char)(*s << 1);
+               }
            }
        }
       else
@@ -106,11 +117,11 @@ find_pos(char *s, unsigned len, int *low, int *high)
  * bit size, i.e. they fit into an (u)int or a (u)short.
  */
 static void
-  gen_reps
-  (const name_attribute_pair * nap,    /* array of name_attribute_pair records */
-   const char *name,           /* name of the represented record type  */
-   int len,                    /* size of the record in bytes          */
-   int bias)
+gen_reps(
+         const name_attribute_pair * nap,      /* array of name_attribute_pair records */
+         const char *name,     /* name of the represented record type  */
+         int len,              /* size of the record in bytes          */
+         int bias)
 {
   int i, n, l, cnt = 0, low, high;
   int width = strlen(RES_NAME) + 3;
@@ -122,7 +133,7 @@ static void
   for (i = 0; nap[i].name != (char *)0; i++)
     {
       cnt++;
-      l = strlen(nap[i].name);
+      l = (int)strlen(nap[i].name);
       if (l > width)
        width = l;
     }
@@ -160,7 +171,7 @@ static void
 static void
 chtype_rep(const char *name, attr_t mask)
 {
-  attr_t x = -1;
+  attr_t x = (attr_t)-1;
   attr_t t = x & mask;
   int low, high;
   int l = find_pos((char *)&t, sizeof(t), &low, &high);
@@ -217,7 +228,7 @@ gen_mrep_rep(const char *name)
   mrep_rep("Z", &x);
 
   memset(&x, 0, sizeof(x));
-  x.bstate = -1;
+  x.bstate = (mmask_t) - 1;
   mrep_rep("Bstate", &x);
 
   printf("      end record;\n");
@@ -283,11 +294,12 @@ gen_attr_set(const char *name)
   chtype attr = A_ATTRIBUTES & ~A_COLOR;
   int start = -1;
   int len = 0;
-  int i, set;
+  int i;
+  chtype set;
   for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
 
     {
-      set = attr & 1;
+      set = (attr & 1);
       if (set)
        {
          if (start < 0)
@@ -771,6 +783,25 @@ acs_def(const char *name, chtype *a)
 static void
 gen_acs(void)
 {
+  printf("   type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
+  printf("        of Attributed_Character;\n");
+#if USE_REENTRANT || BROKEN_LINKER
+  printf("   type C_ACS_Ptr is access C_ACS_Map;\n");
+  printf("   function ACS_Map return C_ACS_Ptr;\n");
+  printf("   pragma Import (C, ACS_Map, \""
+        NCURSES_WRAP_PREFIX
+        "acs_map\");\n");
+#else
+  printf("   ACS_Map : C_ACS_Map;\n");
+  printf("   pragma Import (C, ACS_Map, \"acs_map\");\n");
+#endif
+  printf("   --\n");
+  printf("   --\n");
+  printf("   --  Constants for several characters from the Alternate Character Set\n");
+  printf("   --  You must use these constants as indices into the ACS_Map array\n");
+  printf("   --  to get the corresponding attributed character at runtime.\n");
+  printf("   --\n");
+
 #ifdef ACS_ULCORNER
   acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
 #endif
@@ -877,8 +908,7 @@ gen_acs(void)
    printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
           #name, name)
 
-static
-void
+static void
 gen_mouse_events(void)
 {
   mmask_t all1 = 0;
@@ -1004,6 +1034,56 @@ gen_mouse_events(void)
   GEN_EVENT(BUTTON4_EVENTS, all4);
 }
 
+static void
+wrap_one_var(const char *c_var,
+            const char *c_type,
+            const char *ada_func,
+            const char *ada_type)
+{
+#if USE_REENTRANT
+  /* must wrap variables */
+  printf("\n");
+  printf("   function %s return %s\n", ada_func, ada_type);
+  printf("   is\n");
+  printf("      function Result return %s;\n", c_type);
+  printf("      pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var);
+  printf("   begin\n");
+  if (strcmp(c_type, ada_type))
+    printf("      return %s (Result);\n", ada_type);
+  else
+    printf("      return Result;\n");
+  printf("   end %s;\n", ada_func);
+#else
+  /* global variables are really global */
+  printf("\n");
+  printf("   function %s return %s\n", ada_func, ada_type);
+  printf("   is\n");
+  printf("      Result : %s;\n", c_type);
+  printf("      pragma Import (C, Result, \"%s\");\n", c_var);
+  printf("   begin\n");
+  if (strcmp(c_type, ada_type))
+    printf("      return %s (Result);\n", ada_type);
+  else
+    printf("      return Result;\n");
+  printf("   end %s;\n", ada_func);
+#endif
+}
+
+#define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
+       wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
+
+static void
+gen_public_vars(void)
+{
+  GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
+  GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
+  GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
+  GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
+  GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
+  GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
+  GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
+}
+
 /*
  * Output some comment lines indicating that the file is generated.
  * The name parameter is the name of the facility to be used in
@@ -1079,15 +1159,13 @@ color_def(const char *name, int value)
   printf("   %-16s : constant Color_Number := %d;\n", name, value);
 }
 
-#define HAVE_USE_DEFAULT_COLORS 1
-
 /*
  * Generate all color definitions
  */
 static void
 gen_color(void)
 {
-#ifdef HAVE_USE_DEFAULT_COLORS
+#if HAVE_USE_DEFAULT_COLORS
   color_def("Default_Color", -1);
 #endif
 #ifdef COLOR_BLACK
@@ -1175,73 +1253,24 @@ eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
     *etimin = code;
   if (code > *etimax)
     *etimax = code;
-  return strlen(buf);
+  return (int)strlen(buf);
 }
 
-#define GEN_OFFSET(member,itype)                                    \
-  if (sizeof(((WINDOW*)0)->member)==sizeof(itype)) {                \
-    o = offsetof(WINDOW, member);                                   \
-    if ((o%sizeof(itype) == 0)) {                                   \
-       printf("   Offset%-*s : constant Natural := %2ld; --  %s\n", \
-              12, #member, (long)(o/sizeof(itype)),#itype);         \
-    }                                                               \
-  }
-
 static void
 gen_offsets(void)
 {
-  long o;
   const char *s_bool = "";
 
-  GEN_OFFSET(_maxy, short);
-  GEN_OFFSET(_maxx, short);
-  GEN_OFFSET(_begy, short);
-  GEN_OFFSET(_begx, short);
-  GEN_OFFSET(_cury, short);
-  GEN_OFFSET(_curx, short);
-  GEN_OFFSET(_yoffset, short);
-  GEN_OFFSET(_pary, int);
-  GEN_OFFSET(_parx, int);
   if (sizeof(bool) == sizeof(char))
     {
-      GEN_OFFSET(_notimeout, char);
-      GEN_OFFSET(_clear, char);
-      GEN_OFFSET(_leaveok, char);
-      GEN_OFFSET(_scroll, char);
-      GEN_OFFSET(_idlok, char);
-      GEN_OFFSET(_idcok, char);
-      GEN_OFFSET(_immed, char);
-      GEN_OFFSET(_sync, char);
-      GEN_OFFSET(_use_keypad, char);
-
       s_bool = "char";
     }
   else if (sizeof(bool) == sizeof(short))
     {
-      GEN_OFFSET(_notimeout, short);
-      GEN_OFFSET(_clear, short);
-      GEN_OFFSET(_leaveok, short);
-      GEN_OFFSET(_scroll, short);
-      GEN_OFFSET(_idlok, short);
-      GEN_OFFSET(_idcok, short);
-      GEN_OFFSET(_immed, short);
-      GEN_OFFSET(_sync, short);
-      GEN_OFFSET(_use_keypad, short);
-
       s_bool = "short";
     }
   else if (sizeof(bool) == sizeof(int))
     {
-      GEN_OFFSET(_notimeout, int);
-      GEN_OFFSET(_clear, int);
-      GEN_OFFSET(_leaveok, int);
-      GEN_OFFSET(_scroll, int);
-      GEN_OFFSET(_idlok, int);
-      GEN_OFFSET(_idcok, int);
-      GEN_OFFSET(_immed, int);
-      GEN_OFFSET(_sync, int);
-      GEN_OFFSET(_use_keypad, int);
-
       s_bool = "int";
     }
   printf("   Sizeof%-*s : constant Natural := %2ld; --  %s\n",
@@ -1291,9 +1320,6 @@ main(int argc, char *argv[])
        case 'A':               /* chtype translation into Ada95 record type */
          gen_attr_set("Character_Attribute_Set");
          break;
-       case 'K':               /* translation of keycodes */
-         gen_keydefs(0);
-         break;
        case 'B':               /* write some initial comment lines */
          basedefs();
          break;
@@ -1306,24 +1332,30 @@ main(int argc, char *argv[])
        case 'E':               /* generate Mouse Event codes */
          gen_mouse_events();
          break;
-       case 'M':               /* generate constants for the ACS characters */
-         gen_acs();
+       case 'K':               /* translation of keycodes */
+         gen_keydefs(0);
          break;
        case 'L':               /* generate the Linker_Options pragma */
          gen_linkopts();
          break;
+       case 'M':               /* generate constants for the ACS characters */
+         gen_acs();
+         break;
        case 'O':               /* generate definitions of the old key code names */
          gen_keydefs(1);
          break;
+       case 'P':               /* generate definitions of the public variables */
+         gen_public_vars();
+         break;
        case 'R':               /* generate representation clause for Attributed character */
          gen_chtype_rep("Attributed_Character");
          break;
-       case 'V':               /* generate version info */
-         gen_version_info();
-         break;
        case 'T':               /* generate the Trace info */
          gen_trace("Trace_Attribute_Set");
          break;
+       case 'V':               /* generate version info */
+         gen_version_info();
+         break;
        default:
          break;
        }