Allow YAZ 2 series only
[ir-tcl-moved-to-github.git] / tclmain.c
index e17cd1e..d426d1c 100644 (file)
--- a/tclmain.c
+++ b/tclmain.c
@@ -1,26 +1,20 @@
 /*
  * IR toolkit for tcl/tk
- * (c) Index Data 1995
+ * (c) Index Data 1995-1996
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: tclmain.c,v $
- * Revision 1.8  1995-06-21 15:16:44  adam
- * More work on configuration.
+ * Revision 1.21  2000-02-22 23:11:03  adam
+ * Fixed include statements.
  *
- * Revision 1.7  1995/06/21  11:04:54  adam
- * Uses GNU autoconf 2.3.
- * Install procedure implemented.
- * boook bitmaps moved to sub directory bitmaps.
+ * Revision 1.20  1997/04/30 07:26:08  adam
+ * Added support for shared libaries (if supported by Tcl itself).
  *
- * Revision 1.6  1995/05/29  08:44:28  adam
- * Work on delete of objects.
- *
- * Revision 1.5  1995/03/20  08:53:30  adam
- * Event loop in tclmain.c rewritten. New method searchStatus.
- *
- * Revision 1.4  1995/03/17  07:50:31  adam
- * Headers have changed a little.
+ * Revision 1.19  1996/08/20 09:27:49  adam
+ * More work on explain.
+ * Renamed tkinit.c to tkmain.c. The tcl shell uses the Tcl 7.5 interface
+ * for socket i/o instead of the handcrafted one (for Tcl 7.3 and Tcl7.4).
  *
  */
 
 #ifdef _AIX
 #include <sys/select.h>
 #endif
+
 #include <assert.h>
 
 #include <tcl.h>
-
+#include <yaz/log.h>
 #include "ir-tcl.h"
 
+int Tcl_AppInit (Tcl_Interp *interp)
+{
+    if (Tcl_Init(interp) == TCL_ERROR)
+        return TCL_ERROR;
+    if (Irtcl_Init(interp) == TCL_ERROR)
+        return TCL_ERROR;
+#if USE_WAIS
+    if (Waistcl_Init(interp) == TCL_ERROR)
+        return TCL_ERROR;
+#endif
+    return TCL_OK;
+}
+
+#if TCL_MAJOR_VERSION > 7 || (TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION > 4)
+/* new version of tcl: version > 7.4 */
+extern int matherr ();
+int *tclDummyMathPtr = (int*) matherr;
+
+int main (int argc, char **argv)
+{
+    Tcl_Main (argc, argv, Tcl_AppInit);
+    return 0;
+}
+
+#else
+/* old version of tcl: version <= 7.4 */
+
 static char *fileName = NULL;
+extern int main ();
+int *tclDummyMainPtr = (int*) main;
 
 /* select(2) callbacks */
 struct callback {
-    void (*r_handle)(void *p);
-    void (*w_handle)(void *p);
-    void (*x_handle)(void *p);
-    void *obj;
+    void (*handle)(ClientData, int, int, int);
+    int r, w, e;
+    ClientData obj;
 };
 #define MAX_CALLBACK 200
 
@@ -52,15 +75,6 @@ static int max_fd = 3;            /* don't worry: it will grow... */
 
 void tcl_mainloop (Tcl_Interp *interp, int interactive);
 
-int Tcl_AppInit (Tcl_Interp *interp)
-{
-    if (Tcl_Init(interp) == TCL_ERROR)
-        return TCL_ERROR;
-    if (ir_tcl_init(interp) == TCL_ERROR)
-        return TCL_ERROR;
-    return TCL_OK;
-}
-
 int main (int argc, char **argv)
 {
     Tcl_Interp *interp;
@@ -76,11 +90,7 @@ int main (int argc, char **argv)
         fprintf(stderr, "Tcl_AppInit failed: %s\n", interp->result);
     }
     for (i=0; i<MAX_CALLBACK; i++)
-    {
-        callback_table[i].r_handle = NULL;
-        callback_table[i].w_handle = NULL;
-        callback_table[i].x_handle = NULL;
-    }
+        callback_table[i].handle = NULL;
     if (fileName)
     {
         code = Tcl_EvalFile (interp, fileName);
@@ -90,11 +100,34 @@ int main (int argc, char **argv)
             exit (1);
         tcl_mainloop (interp, 0);
     }
-    else
+    else if (isatty(0))
     {
+
         Tcl_SetVar (interp, "tcl_interactive", "1", TCL_GLOBAL_ONLY);
         tcl_mainloop (interp, 1);
     }
+    else
+    {
+        Tcl_DString command;
+        char input_buf[1024];
+        int count;
+
+        printf ("xx\n");
+        Tcl_DStringInit (&command);
+        while (fgets (input_buf, 1024, stdin))
+        {
+            count = strlen(input_buf);
+            Tcl_DStringAppend (&command, input_buf, count);
+            if (Tcl_CommandComplete (Tcl_DStringValue (&command)))
+            {
+                int code = Tcl_Eval (interp, Tcl_DStringValue (&command));
+                Tcl_DStringFree (&command);
+                if (code)
+                    printf ("Error: %s\n", interp->result);
+            }
+        }
+        tcl_mainloop (interp, 0);
+    }
     exit (0);
 }
 
@@ -112,7 +145,7 @@ void tcl_mainloop (Tcl_Interp *interp, int interactive)
     if (interactive)
     {
         Tcl_DStringInit (&command);
-        printf ("[TCL]"); fflush (stdout);
+        printf ("%% "); fflush (stdout);
     }
     while (1)
     {
@@ -123,17 +156,17 @@ void tcl_mainloop (Tcl_Interp *interp, int interactive)
             FD_SET (0, &fdset_tcl_r);
         for (res=0, i=min_fd; i<=max_fd; i++)
         {
-            if (callback_table[i].w_handle)
+            if (callback_table[i].handle && callback_table[i].w)
             {
                 FD_SET (i, &fdset_tcl_w);
                 res++;
             }
-            if (callback_table[i].r_handle)
+            if (callback_table[i].handle && callback_table[i].r)
             {
                 FD_SET (i, &fdset_tcl_r);
                 res++;
             }
-            if (callback_table[i].x_handle)
+            if (callback_table[i].handle && callback_table[i].e)
             {
                 FD_SET (i, &fdset_tcl_x);
                 res++;
@@ -151,26 +184,26 @@ void tcl_mainloop (Tcl_Interp *interp, int interactive)
             continue;
         for (i=min_fd; i<=max_fd; i++)
         {
-            if (FD_ISSET (i, &fdset_tcl_r))
-            {
-                assert (callback_table[i].r_handle);
-                (*callback_table[i].r_handle) (callback_table[i].obj);
-            }
-            if (FD_ISSET (i, &fdset_tcl_w))
-            {
-                assert (callback_table[i].w_handle);
-                (*callback_table[i].w_handle) (callback_table[i].obj);
-            }
-            if (FD_ISSET (i, &fdset_tcl_x))
-            {
-                assert (callback_table[i].x_handle);
-                (*callback_table[i].x_handle) (callback_table[i].obj);
-            }
+            int r_flag = 0;
+            int w_flag = 0;
+            int e_flag = 0;
+
+            if (!callback_table[i].handle)
+                continue;
+            if (FD_ISSET (i, &fdset_tcl_r) && callback_table[i].r)
+                r_flag = 1;
+            if (FD_ISSET (i, &fdset_tcl_w) && callback_table[i].w)
+                w_flag = 1;
+            if (FD_ISSET (i, &fdset_tcl_x) && callback_table[i].e)
+                e_flag = 1;
+            if (r_flag || w_flag || e_flag)
+                (*callback_table[i].handle)(callback_table[i].obj,
+                 r_flag, w_flag, e_flag);
         }
         if (interactive && FD_ISSET(0, &fdset_tcl_r))
         {
-            char input_buf[256];
-            int count = read (0, input_buf, 256);
+            char input_buf[1024];
+            int count = read (0, input_buf, 1024);
 
             if (count <= 0)
                 exit (0);
@@ -180,40 +213,25 @@ void tcl_mainloop (Tcl_Interp *interp, int interactive)
                 int code = Tcl_Eval (interp, Tcl_DStringValue (&command));
                 Tcl_DStringFree (&command);
                 if (code)
-                    printf ("[ERR:%s]\n", interp->result);
-                else
-                    printf ("[RES:%s]\n", interp->result);
-                printf ("[TCL]"); fflush (stdout);
+                    printf ("Error: %s\n", interp->result);
+                else if (*interp->result)
+                    printf ("%s\n", interp->result);
+                printf ("%% "); fflush (stdout);
             }
         }
     }
 }
 
-void ir_select_add (int fd, void *obj)
-{
-    callback_table[fd].obj = obj;
-    callback_table[fd].r_handle = ir_select_read;
-    callback_table[fd].w_handle = NULL;
-    callback_table[fd].x_handle = NULL;
-    if (fd > max_fd)
-        max_fd = fd;
-}
-
-void ir_select_add_write (int fd, void *obj)
+void ir_tcl_select_set (void (*f)(ClientData clientData, int r, int w, int e),
+                        int fd, ClientData clientData, int r, int w, int e)
 {
-    callback_table[fd].w_handle = ir_select_write;
+    callback_table[fd].handle = f;
+    callback_table[fd].obj = clientData;
+    callback_table[fd].r = r;
+    callback_table[fd].w = w;
+    callback_table[fd].e = e;
     if (fd > max_fd)
         max_fd = fd;
 }
 
-void ir_select_remove_write (int fd, void *obj)
-{
-    callback_table[fd].w_handle = NULL;
-}
-
-void ir_select_remove (int fd, void *obj)
-{
-    callback_table[fd].r_handle = NULL;
-    callback_table[fd].w_handle = NULL;
-    callback_table[fd].x_handle = NULL;
-}
+#endif