This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

 

  Faking Templates In C
  Submitted by



Ok, I know this is old news to most people here on this site, but some people may benefit from it. The reason why I wanted to do this is because I'm currently abroad and only have access to the free lcc-win32 compiler and I badly needed a vector-"template". I didn't just want a vector with void ptrs. It's nothing fancy or anything, but the day may come when somebody needs it, here goes:

#define CREATE_VECTOR_TYPE_H(type) \
typedef struct _##type##_Vector{ \
  type *pArray; \
  type illegal; \
  int size; \
  int len; \
} type##_Vector; \
void type##_InitVector(type##_Vector *pV, type illegal); \
void type##_InitVectorEx(type##_Vector *pV, int size, type illegal); \
void type##_ClearVector(type##_Vector *pV); \
void type##_DeleteAll(type##_Vector *pV); \
void type##_EraseVector(type##_Vector *pV); \
int type##_AddElem(type##_Vector *pV, type Data); \
type type##_SetElemAt(type##_Vector *pV, int pos, type data); \
type type##_GetElemAt(type##_Vector *pV, int pos);

#define CREATE_VECTOR_TYPE_C(type) \ void type##_InitVector(type##_Vector *pV, type illegal) \ { \ type##_InitVectorEx(pV, DEF_SIZE, illegal); \ } \ void type##_InitVectorEx(type##_Vector *pV, int size, type illegal) \ { \ pV-len = 0; \ pV-illegal = illegal; \ pV-pArray = malloc(sizeof(type) * size); \ pV-size = size; \ } \ void type##_ClearVector(type##_Vector *pV) \ { \ memset(pV-pArray, 0, sizeof(type) * pV-size); \ pV-len = 0; \ } \ void type##_EraseVector(type##_Vector *pV) \ { \ if(pV-pArray != NULL) \ free(pV-pArray); \ pV-len = 0; \ pV-size = 0; \ pV-pArray = NULL; \ } \ int type##_AddElem(type##_Vector *pV, type Data) \ { \ type *pTmp; \ if(pV-len = pV-size) \ { \ pTmp = malloc(sizeof(type) * pV-size * 2); \ if(pTmp == NULL) \ return -1; \ memcpy(pTmp, pV-pArray, sizeof(type) * pV-size); \ free(pV-pArray); \ pV-pArray = pTmp; \ pV-size *= 2; \ } \ pV-pArray[pV-len] = Data; \ return pV-len++; \ } \ type type##_SetElemAt(type##_Vector *pV, int pos, type data) \ { \ type old = pV-illegal; \ if(pos = 0 && pos <= pV-len) \ { \ old = pV-pArray[pos]; \ pV-pArray[pos] = data; \ } \ return old; \ } \ type type##_GetElemAt(type##_Vector *pV, int pos) \ { \ if(pos = 0 && pos <= pV-len) \ return pV-pArray[pos]; \ return pV-illegal; \ }



These two macros will create the vector for the type you specify. In the header file you write:

CREATE_VECTOR_TYPE_H(int) 



And in the source-file:

CREATE_VECTOR_TYPE_C(int)
// then you use the functions like
int_Vector iv;
int_InitVector(&iv, -1); // -1 is the illegal
// value of this vector, int_GetElemAt()
// returns this if the element doesn't exist.
int_AddElem(&iv, 10); 



The project I'm working on is a small script-language with a VM, currently I have only implemented the VM and an assembler to compile code for it and now I'm working on a preprocessor, both for the assembler code and the language.

/Andreas Magnusson


The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

 

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.