diff lib/imlib/imdata.c @ 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imdata.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,348 @@
+#ifndef lint
+static char *rcsid = "$Id: imdata.c,v 1.7 1994/06/02 02:20:23 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+
+#define B_GET16(p)	(((p)[0]<<8) + (p)[1])
+#define B_GET32(p)	(((p)[0]<<24) + ((p)[1]<<16) + ((p)[2]<<8) + (p)[3])
+#define L_GET16(p)	((p)[0] + ((p)[1]<<8))
+#define L_GET32(p)	((p)[0] + ((p)[1]<<8) + ((p)[2]<<16) + ((p)[3] << 24))
+
+#define B_PUT16(x, p)	(p)[0] = ((x)>>8) & 0xff; (p)[1] = (x) & 0xff
+#define B_PUT32(x, p)	(p)[0] = ((x)>>24) & 0xff; (p)[1] = ((x)>>16) & 0xff; \
+			(p)[2] = ((x)>>8) & 0xff; (p)[3] = (x) & 0xff
+#define L_PUT16(x, p)	(p)[0] = (x) & 0xff; (p)[1] = ((x)>>8) & 0xff
+#define L_PUT32(x, p)	(p)[0] = (x) & 0xff; (p)[1] = ((x)>>8) & 0xff; \
+			(p)[2] = ((x)>>16) & 0xff; (p)[3] = ((x)>>24) & 0xff;
+
+int
+IMGetC8(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    int x;
+
+    x = *((unsigned char *)IMBUFDATA(ibp) + offset);
+    return x;
+}
+
+unsigned int
+IMGetC16(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    unsigned char *p = (unsigned char *)IMBUFDATA(ibp) + offset;
+    unsigned int x;
+
+    if (conn->byte_order == ORDER_BIG) {
+	x = B_GET16(p);
+    } else {
+	x = L_GET16(p);
+    }
+
+    return x;
+}
+
+int
+IMGetI16(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    long x;
+
+    x = (long)IMGetC16(conn, offset);
+    return (x < 32768) ? (int)x : (int)(x - 65536L);
+}
+
+unsigned long
+IMGetC32(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    unsigned char *p = (unsigned char *)IMBUFDATA(ibp) + offset;
+    unsigned long x;
+
+    if (conn->byte_order == ORDER_BIG) {
+	x = B_GET32(p);
+    } else {
+	x = L_GET32(p);
+    }
+
+    return x;
+}
+
+void
+IMGetString(conn, offset, buf, len)
+IMConnection *conn;
+int offset;
+char *buf;
+int len;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    char *p = IMBUFDATA(ibp) + offset;
+
+    bcopy(p, buf, len);
+    buf[len] = '\0';
+}
+
+void
+IMPutC8(conn, x)
+IMConnection *conn;
+int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char c = (unsigned char)x;
+
+    IMBufAdd(ibp, (char *)&c, 1);
+}
+
+void
+IMPutC16(conn, x)
+IMConnection *conn;
+unsigned int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 2);
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT16(x, p);
+    } else {
+	L_PUT16(x, p);
+    }
+}
+
+void
+IMPutC32(conn, x)
+IMConnection *conn;
+unsigned long x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 4);
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT32(x, p);
+    } else {
+	L_PUT32(x, p);
+    }
+}
+
+void
+IMPutI16(conn, x)
+IMConnection *conn;
+int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 2);
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT16(x, p);
+    } else {
+	L_PUT16(x, p);
+    }
+}
+
+void
+IMPutString(conn, s, len)
+IMConnection *conn;
+char *s;
+int len;
+{
+    if (len < 0) len = strlen(s);
+    IMBufAdd(&conn->out_buf, s, len);
+}
+
+void
+IMPutPad(conn)
+IMConnection *conn;
+{
+    int remainder;
+    int npad;
+    static char padding[] = { 0, 0, 0, 0 };
+
+    if ((remainder = IMBUFLEN(&conn->out_buf) % 4) != 0) {
+	npad = 4 - remainder;
+	IMBufAdd(IM_OUTBUF(conn), padding, npad);
+    }
+}
+
+void
+IMRewriteC16(conn, pos, x)
+IMConnection *conn;
+int pos;
+unsigned int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char p[2];
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT16(x, p);
+    } else {
+	L_PUT16(x, p);
+    }
+    IMBufOverwrite(ibp, pos, (char *)p, 2);
+}
+
+int
+IMWritePos(conn)
+IMConnection *conn;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+
+    return IMBUFLEN(ibp);
+}
+
+int
+IMPutHeader(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    int offset;
+
+    offset = IMBUFLEN(&conn->out_buf);
+    arglen = (arglen + 3) / 4;
+#ifdef XIM_BC
+    if (conn->has_length_bug) arglen *= 4;
+#endif
+    IMPutC8(conn, major);
+    IMPutC8(conn, minor);
+    IMPutC16(conn, (unsigned int)arglen);
+    return offset;
+}
+
+void
+IMFinishRequest(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned int arglen;
+
+    /*
+     * Append padding bytes, if needed.
+     */
+    IMPutPad(conn);
+
+    /*
+     * Offset points the beginning of the request.
+     * Following is a Request header which is 4-byte long.
+     */
+    arglen = (unsigned int)((IMBUFLEN(ibp) - offset - 4) / 4);
+#ifdef XIM_BC
+    if (conn->has_length_bug) arglen *= 4;
+#endif
+
+    /*
+     * rewrite the length field of the request header.
+     */
+    IMRewriteC16(conn, offset + 2, arglen);
+
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+void
+IMCancelRequest(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+
+    IMBufDiscard(ibp, offset - IMBUFLEN(ibp));
+}
+
+void
+IMSendSimpleRequest(conn, major, minor)
+IMConnection *conn;
+int major;
+int minor;
+{
+    IMPutC8(conn, major);
+    IMPutC8(conn, minor);
+    /*
+     * This function (IMSendSimpleRequest) might be called when
+     * client's byte order is yet unknown, so usually it is unwise to
+     * call IMPutC16().  But in this particular case where the value
+     * to be put is zero, it is perfectly ok.
+     */
+    IMPutC16(conn, 0);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+void
+IMSendRequestWithIC(conn, major, minor, icp)
+IMConnection *conn;
+int major;
+int minor;
+IMIC *icp;
+{
+    (void)IMPutHeader(conn, major, minor, 4);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+void
+IMSendError(conn, code, imid, icid, msg)
+IMConnection *conn;
+int code;
+unsigned int imid;
+unsigned int icid;
+char *msg;
+{
+    int offset;
+    int msg_len;
+    unsigned int valid_flag = 0;
+
+    msg_len = strlen(msg);
+
+    if (imid != 0) valid_flag |= 1;
+    if (icid != 0) valid_flag |= 2;
+
+    offset = IMPutHeader(conn, XIM_ERROR, 0, 0);
+    IMPutC16(conn, imid);
+    IMPutC16(conn, icid);
+    IMPutC16(conn, valid_flag);
+    IMPutC16(conn, (unsigned int)code);
+    IMPutC16(conn, (unsigned int)msg_len);
+    IMPutC16(conn, 0);
+    IMPutString(conn, msg, msg_len);
+    IMFinishRequest(conn, offset);
+}
+
+void
+IMSendBadProtocol(conn, msg)
+IMConnection *conn;
+char *msg;
+{
+    IMSendError(conn, IMBadProtocol, 0, 0, msg);
+}
+
+void
+IMSendBadLength(conn, imid, icid)
+IMConnection *conn;
+unsigned int imid;
+unsigned int icid;
+{
+    IMSendError(conn, IMBadSomething, imid, icid, "Bad request length");
+}