Add some buffer management routines
This commit is contained in:
parent
e042d5b45e
commit
e6ca2a97fc
@ -3,7 +3,7 @@
|
||||
. ../scripts/flags.sh
|
||||
|
||||
function build() {
|
||||
cc $CFLAGS -shared -o "lib/libXmd.so" *.c || \
|
||||
cc $CFLAGS -Iinclude -shared -o "lib/libXmd.so" src/*.c || \
|
||||
echo "XXX FAIL!"
|
||||
}
|
||||
|
||||
|
25
libXmd/include/Xmd/Buffer.h
Normal file
25
libXmd/include/Xmd/Buffer.h
Normal file
@ -0,0 +1,25 @@
|
||||
#ifndef _XmdBuffer_h
|
||||
#define _XmdBuffer_h
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/* Buffer is a struct that keeps track of a variable length array of data. It
|
||||
is like a piggy bank, you can add stuff to it and then break it to get access
|
||||
to all the things you put in. It is intended to be used for reading in
|
||||
variable length strings and files. */
|
||||
typedef struct _XmdBuffer XmdBuffer;
|
||||
|
||||
/* XmdBufferNew creates a new buffer with the specified element size. */
|
||||
XmdBuffer *XmdBufferNew (size_t element);
|
||||
|
||||
/* XmdBufferPush adds a new element to the buffer. */
|
||||
void XmdBufferPush (XmdBuffer *buffer, void *element);
|
||||
|
||||
/* XmdBufferBreak frees the buffer without freeing its data. Its data is
|
||||
returned and must be freed manually at some point. */
|
||||
void *XmdBufferBreak (XmdBuffer *buffer);
|
||||
|
||||
/* XmdBufferFree frees the buffer and any data associated with it. */
|
||||
void XmdBufferFree (XmdBuffer *buffer);
|
||||
|
||||
#endif
|
61
libXmd/src/Buffer.c
Normal file
61
libXmd/src/Buffer.c
Normal file
@ -0,0 +1,61 @@
|
||||
#include <Xmd/Buffer.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define XmdBUFFER_GROWTH_FACTOR 2
|
||||
|
||||
struct _XmdBuffer {
|
||||
void * data;
|
||||
size_t element;
|
||||
size_t length;
|
||||
size_t capacity;
|
||||
};
|
||||
|
||||
static void XmdBufferResize (XmdBuffer *buffer, size_t length);
|
||||
static void XmdBufferFit (XmdBuffer *buffer);
|
||||
static void *XmdBufferOffset (XmdBuffer *buffer, size_t index);
|
||||
|
||||
XmdBuffer *XmdBufferNew (size_t element) {
|
||||
XmdBuffer *buffer = calloc(1, sizeof(XmdBuffer));
|
||||
buffer->element = element;
|
||||
buffer->capacity = 1;
|
||||
XmdBufferFit(buffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void XmdBufferResize (XmdBuffer *buffer, size_t length) {
|
||||
buffer->length = length;
|
||||
XmdBufferFit(buffer);
|
||||
}
|
||||
|
||||
void XmdBufferFit (XmdBuffer *buffer) {
|
||||
if (buffer->length > buffer->capacity) {
|
||||
buffer->capacity *= XmdBUFFER_GROWTH_FACTOR;
|
||||
buffer->data = realloc (
|
||||
buffer->data,
|
||||
buffer->capacity * buffer->element);
|
||||
}
|
||||
}
|
||||
|
||||
void *XmdBufferOffset (XmdBuffer *buffer, size_t index) {
|
||||
return buffer->data + (index * buffer->element);
|
||||
}
|
||||
|
||||
void XmdBufferPush (XmdBuffer *buffer, void *element) {
|
||||
XmdBufferResize(buffer, buffer->length + 1);
|
||||
memcpy (
|
||||
XmdBufferOffset(buffer, buffer->length - 1),
|
||||
element,
|
||||
buffer->element);
|
||||
}
|
||||
|
||||
void *XmdBufferBreak (XmdBuffer *buffer) {
|
||||
void *data = buffer->data;
|
||||
free(buffer);
|
||||
return data;
|
||||
}
|
||||
|
||||
void XmdBufferFree (XmdBuffer *buffer) {
|
||||
free(buffer->data);
|
||||
free(buffer);
|
||||
}
|
37
libXmd/src/Icon.c
Normal file
37
libXmd/src/Icon.c
Normal file
@ -0,0 +1,37 @@
|
||||
#include <Xmd/Icon.h>
|
||||
|
||||
Pixmap _XmdLoadBitmapIcon (Widget widget, unsigned char *bits, int width, int height) {
|
||||
Pixel fg, bg;
|
||||
XtVaGetValues (widget,
|
||||
XmNforeground, &fg,
|
||||
XmNbackground, &bg,
|
||||
NULL);
|
||||
return XCreatePixmapFromBitmapData (
|
||||
XtDisplay (widget),
|
||||
RootWindowOfScreen(XtScreen(widget)),
|
||||
(char *)(bits), width, height,
|
||||
fg, bg, DefaultDepthOfScreen(XtScreen(widget)));
|
||||
}
|
||||
|
||||
Pixmap XmdReadBitmapFile (Widget widget, const char *filename) {
|
||||
Pixel fg, bg;
|
||||
XtVaGetValues (widget,
|
||||
XmNforeground, &fg,
|
||||
XmNbackground, &bg,
|
||||
NULL);
|
||||
unsigned int width, height;
|
||||
unsigned char *data;
|
||||
int garbage;
|
||||
XReadBitmapFileData (
|
||||
filename,
|
||||
&width, &height,
|
||||
&data,
|
||||
&garbage, &garbage);
|
||||
Pixmap result = XCreatePixmapFromBitmapData (
|
||||
XtDisplay (widget),
|
||||
RootWindowOfScreen(XtScreen(widget)),
|
||||
(char *)(data), width, height,
|
||||
fg, bg, DefaultDepthOfScreen(XtScreen(widget)));
|
||||
XFree(data);
|
||||
return result;
|
||||
}
|
Loading…
Reference in New Issue
Block a user