#include <stdio.h>
#define NEED_REPLIES
#define NEED_EVENTS
#include "Xlibint.h"
#include "XKBlibint.h"
#include <X11/extensions/XKBproto.h>
int
_XkbInitReadBuffer(Display *dpy,XkbReadBufferPtr buf,int size)
{
if ((dpy!=NULL) && (buf!=NULL) && (size>0)) {
buf->error= 0;
buf->size= size;
buf->start= buf->data= _XkbAlloc(size);
if (buf->start) {
_XRead(dpy, buf->start, size);
return 1;
}
}
return 0;
}
#define _XkbReadBufferDataLeft(b) (((b)->size)-((b)->data-(b)->start))
int
_XkbSkipReadBufferData(XkbReadBufferPtr from,int size)
{
if (size==0)
return 1;
if ((from==NULL)||(from->error)||(size<1)||
(_XkbReadBufferDataLeft(from)<size))
return 0;
from->data+= size;
return 1;
}
int
_XkbCopyFromReadBuffer(XkbReadBufferPtr from,char *to,int size)
{
if (size==0)
return 1;
if ((from==NULL)||(from->error)||(to==NULL)||(size<1)||
(_XkbReadBufferDataLeft(from)<size))
return 0;
memcpy(to,from->data,size);
from->data+= size;
return 1;
}
#ifdef XKB_FORCE_INT_KEYSYM
int
_XkbReadCopyKeySyms(int *wire,KeySym *to,int num_words)
{
while (num_words-->0) {
*to++= *wire++;
}
return 1;
}
int
_XkbReadBufferCopyKeySyms(XkbReadBufferPtr from,KeySym *to,int num_words)
{
if ((unsigned)(num_words*4)>_XkbReadBufferDataLeft(from))
return 0;
_XkbReadCopyKeySyms((int *)from->data,to,num_words);
from->data+= (4*num_words);
return True;
}
int
_XkbWriteCopyKeySyms (register KeySym *from,CARD32 *to,int len)
{
while (len-->0) {
*to++= (CARD32)*from++;
}
return True;
}
#endif
#ifdef LONG64
int
_XkbReadCopyData32(int *wire,long *to,int num_words)
{
while (num_words-->0) {
*to++= *wire++;
}
return 1;
}
#endif
#ifdef WORD64
int
_XkbReadCopyData32(int *from,long *lp,int num_words)
{
long *lpack;
long mask32 = 0x00000000ffffffff;
long maskw, i, bits;
lpack = (long *)from;
bits = 32;
for (i=0;i<num_words;i++) {
maskw = mask32 << bits;
*lp++ = (*lpack & maskw) >> bits;
bits = bits ^ 32;
if (bits)
lpack++;
}
return 1;
}
#endif
#if defined(LONG64) || defined(WORD64)
int
_XkbReadBufferCopy32(XkbReadBufferPtr from,long *to,int num_words)
{
if ((unsigned)(num_words*4)>_XkbReadBufferDataLeft(from))
return 0;
_XkbReadCopyData32((int *)from->data,to,num_words);
from->data+= (4*num_words);
return True;
}
#endif
#ifdef LONG64
int
_XkbWriteCopyData32 (register unsigned long *from,CARD32 *to,int len)
{
while (len-->0) {
*to++= (CARD32)*from++;
}
return True;
}
#endif
#ifdef WORD64
_XkbWriteCopyData32 Not Implemented Yet for sizeof(int)==8
#endif
char *
_XkbPeekAtReadBuffer(XkbReadBufferPtr from,int size)
{
if ((from==NULL)||(from->error)||(size<1)||
(_XkbReadBufferDataLeft(from)<size))
return 0;
return from->data;
}
char *
_XkbGetReadBufferPtr(XkbReadBufferPtr from,int size)
{
char *ptr;
if ((from==NULL)||(from->error)||(size<1)||
(_XkbReadBufferDataLeft(from)<size))
return 0;
ptr= from->data;
from->data+= size;
return ptr;
}
int
_XkbFreeReadBuffer(XkbReadBufferPtr buf)
{
if ((buf!=NULL) && (buf->start!=NULL)) {
int left;
left= (int)_XkbReadBufferDataLeft(buf);
if (buf->start!=NULL)
Xfree(buf->start);
buf->size= 0;
buf->start= buf->data= NULL;
return left;
}
return 0;
}
Bool
_XkbGetReadBufferCountedString(XkbReadBufferPtr buf,char **rtrn)
{
CARD16 len,*pLen;
int left;
char * str = NULL;
if ((buf==NULL)||(buf->error)||((left=(int)_XkbReadBufferDataLeft(buf))<4))
return False;
pLen= (CARD16 *)buf->data;
len= *pLen;
if (len>0) {
if (XkbPaddedSize(len+2)>left)
return False;
str= _XkbAlloc(len+1);
if (str) {
memcpy(str,&buf->data[2],len);
str[len]= '\0';
}
}
buf->data+= XkbPaddedSize(len+2);
*rtrn= str;
return True;
}