The qDecoder Project

qObstack.c File Reference

qDecoder implementation of GNU obstack More...


Functions

Q_OBSTACKqObstack (void)
 Initialize object-stack.
static bool _grow (Q_OBSTACK *obstack, const void *object, size_t size)
 Q_OBSTACK->grow(): Stack object.
static bool _growStr (Q_OBSTACK *obstack, const char *str)
 Q_OBSTACK->growStr(): Stack string.
static bool _growStrf (Q_OBSTACK *obstack, const char *format,...)
 Q_OBSTACK->growStrf(): Stack formatted string.
static void * _getFinal (Q_OBSTACK *obstack, size_t *size)
 Q_OBSTACK->getFinal(): Get merged single final object.
static ssize_t _writeFinal (Q_OBSTACK *obstack, int nFd)
 Q_OBSTACK->writeFinal(): Write out merged final data to the file descriptor.
static size_t _getSize (Q_OBSTACK *obstack)
 Q_OBSTACK->getSize(): Get stacked objects size.
static int _getNum (Q_OBSTACK *obstack)
 Q_OBSTACK->getNum(): Get the number of stacked objects.
static bool _free (Q_OBSTACK *obstack)
 Q_OBSTACK->free(): De-allocate obstack.


Detailed Description

qDecoder implementation of GNU obstack

An qObstack is a pool of memory containing a stack of objects. An qObstack can contain any number of objects of any size.

   [Code sample - String]
   // get new obstack
   Q_OBSTACK *obstack = qObstack();

   // stack
   obstack->growStr(obstack, "AB");             // no need to supply size
   obstack->growStrf(obstack, "%s", "CDE");     // for formatted string
   obstack->grow(obstack, "FGH", 3);            // same effects as above but this can
                                                // be used for object or binary

   // final
   char *final = (char *)obstack->getFinal(obstack, NULL);

   // print out
   printf("Final string = %s\n", final);
   printf("Total Size = %d, Number of Objects = %d\n", obstack->getSize(obstack), obstack->getNum(obstack));

   free(final);
   obstack->free(obstack);

   [Result]
   Final string = ABCDEFGH
   Total Size = 8, Number of Objects = 3

   [Code sample - Object]
   struct sampleobj {
        int     num;
        char    str[10];
   };

   // get new obstack
   Q_OBSTACK *obstack = qObstack();

   // stack
   int i;
   struct sampleobj obj;
   for(i = 0; i < 3; i++) {
        // filling object with sample data
        obj.num  = i;
        sprintf(obj.str, "hello%d", i);

        // stack
        obstack->grow(obstack, (void *)&obj, sizeof(struct sampleobj));
   }

   // final
   struct sampleobj *final = (struct sampleobj *)obstack->getFinal(obstack, NULL);

   // print out
   qContentType("text/plain");
   for(i = 0; i < obstack->getNum(obstack); i++) {
        printf("Object%d final = %d, %s\n", i+1, final[i].num, final[i].str);
   }
   printf("Total Size = %d, Number of Objects = %d\n", obstack->getSize(obstack), obstack->getNum(obstack));

   obstack->free(obstack);

   [Result]
   Object1 final = 0, hello0
   Object2 final = 1, hello1
   Object3 final = 2, hello2
   Total Size = 48, Number of Objects = 3

Note:
Use "--enable-threadsafe" configure script option to use under multi-threaded environments.

Function Documentation

Q_OBSTACK* qObstack ( void   ) 

Initialize object-stack.

Returns:
a pointer of Q_OBSTACK structure
   // allocate memory
   Q_OBSTACK *obstack = qObstack();
   obstack->free(obstack);

static bool _grow ( Q_OBSTACK obstack,
const void *  object,
size_t  size 
) [static]

Q_OBSTACK->grow(): Stack object.

Parameters:
obstack a pointer of Q_OBSTACK
object a pointer of object data
size size of object
Returns:
true if successful, otherwise returns false

static bool _growStr ( Q_OBSTACK obstack,
const char *  str 
) [static]

Q_OBSTACK->growStr(): Stack string.

Parameters:
obstack a pointer of Q_OBSTACK
str a pointer of string
Returns:
true if successful, otherwise returns false

static bool _growStrf ( Q_OBSTACK obstack,
const char *  format,
  ... 
) [static]

Q_OBSTACK->growStrf(): Stack formatted string.

Parameters:
obstack a pointer of Q_OBSTACK
format string format
Returns:
true if successful, otherwise returns false

static void* _getFinal ( Q_OBSTACK obstack,
size_t *  size 
) [static]

Q_OBSTACK->getFinal(): Get merged single final object.

Parameters:
obstack a pointer of Q_OBSTACK
size if size is not NULL, merged object size will be stored.
Returns:
a pointer of finally merged object(malloced), otherwise returns NULL
Note:
User should take care of malloced object.

static ssize_t _writeFinal ( Q_OBSTACK obstack,
int  nFd 
) [static]

Q_OBSTACK->writeFinal(): Write out merged final data to the file descriptor.

Parameters:
obstack a pointer of Q_OBSTACK
nFd a file descriptor for writing out.
Returns:
the number of bytes written, otherwise returns -1;
Note:
It writes out merged data with only one system call. To do this, it uses writev(), so the operation does not cost much.

static size_t _getSize ( Q_OBSTACK obstack  )  [static]

Q_OBSTACK->getSize(): Get stacked objects size.

Parameters:
obstack a pointer of Q_OBSTACK
Returns:
a pointer of finally merged object, otherwise returns NULL

static int _getNum ( Q_OBSTACK obstack  )  [static]

Q_OBSTACK->getNum(): Get the number of stacked objects.

Parameters:
obstack a pointer of Q_OBSTACK
Returns:
a number of stacked objects, otherwise returns 0

static bool _free ( Q_OBSTACK obstack  )  [static]

Q_OBSTACK->free(): De-allocate obstack.

Parameters:
obstack a pointer of Q_OBSTACK
Returns:
true if successful, otherwise returns false


Copyright (c) 2008 The qDecoder Project