Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

nix-common/stack.c

Go to the documentation of this file.
00001 
00012 #include <sys/types.h>
00013 #include <stdlib.h>
00014 #include <stdio.h>
00015 #include <string.h>
00016 #include <strings.h>
00017 #include <assert.h>
00018 #include <appconfig.h>
00019 
00023 typedef struct tag_dsObj {
00024         Int32 *bp; 
00025         Int32 *sp; 
00026         Int32 *se; 
00027         Int32 sl; 
00028 } dsObj;
00029 
00030 #define STACK_IMPL
00031 #include <stack.h>
00032 
00038 static void
00039 StackResize(dsObj *sp, Int32 newSize)
00040 {
00041         ptrdiff_t sd = sp->sp - sp->bp;
00042         sp->sl = newSize;
00043         sp->bp = realloc(sp->bp, sp->sl * sizeof (Int32));
00044         sp->se = sp->bp + (sp->sl - 1);
00045         sp->sp = sp->bp + sd;
00046 }
00047 
00048 dsObj *
00049 StackNew(void)
00050 {
00051         dsObj *rv = calloc(sizeof (dsObj), 1);
00052         return (rv);
00053 }
00054 
00055 void
00056 StackDelete(dsObj *sp)
00057 {
00058         if (sp->bp) free(sp->bp);
00059         free(sp);
00060 }
00061 
00062 void
00063 StackPush(dsObj *sp, Int32 value)
00064 {
00065         if (sp->sp >= sp->se) StackResize(sp, sp->sl ? sp->sl << 1 : 64);
00066         *(++sp->sp) = value;
00067 }
00068 
00069 Int32
00070 StackPop(dsObj *sp)
00071 {
00072         assert(sp->sp != NULL);
00073         if (sp->sp >= sp->bp) {
00074                 assert(sp->sp != NULL && sp->bp != NULL);
00075                 return (*sp->sp--);
00076         }
00077         perror("<DsObj> Object Underflow(out of elements)");
00078         return (-1);
00079 }
00080 
00081 Int8
00082 StackIsEmpty(dsObj *sp)
00083 {
00084         if (sp->sp == NULL)
00085                 return ((Int8)1);
00086         return ((Int8)(sp->sp < sp->bp));
00087 }
00088 
00089 void
00090 StackDoEmpty(dsObj *sp)
00091 {
00092         if (sp->sp != NULL)
00093                 sp->sp = sp->bp - 1;
00094 }
00095 
00096 int
00097 StackNElements(dsObj *sp)
00098 {
00099         return ((sp->sp+1) - sp->bp);
00100 }
00101 
00102 Int32
00103 ListGet(dsObj *sp, Int32 index)
00104 {
00105         if (index >= (sp->sp - sp->bp))
00106                 return (-1);
00107         return (sp->bp[index + 1]);
00108 }
00109 
00110 void
00111 ListSet(dsObj *sp, Int32 index, Int32 element)
00112 {
00113         if (index < (sp->sp - sp->bp))
00114                 sp->bp[index+1] = element;
00115 }
00116 
00117 void
00118 ListInsert(dsObj *sp, Int32 index, Int32 element)
00119 {
00120         if ((index - 1) >= (sp->sp - sp->bp)) {
00121                 StackPush(sp, element);
00122         } else {
00123                 StackPush(sp, 0);
00124                 bcopy(sp->bp + (index - 1), sp->bp + index,
00125                     (sp->sp - (sp->bp + (index - 1))) * sizeof (Int32));
00126                 sp->bp[index] = element;
00127         }
00128 }
00129 
00130 Int32
00131 ListRemove(dsObj *ds, Int32 index)
00132 {
00133         Int32 rv;
00134 
00135         if (index >= (ds->sp - ds->bp))
00136                 return (-1);
00137 
00138         rv = ds->bp[index];
00139         bcopy(ds->bp + (index + 1), ds->bp + index,
00140             (ds->sp - (ds->bp + index)) * sizeof(Int32));
00141         (void)StackPop(ds);
00142 
00143         return (rv);
00144 }

Generated on Mon Aug 30 19:44:16 2004 for pocketcity by doxygen1.2.18