#define uchar unsigned char
#define uint32 unsigned long
#define uint16 unsigned int
#define NULL 0

typedef struct WClassStructA {
        uint16 numSuperClasses;
        uint16 classNameIndex;
        uchar *byteRep; // pointer to class representation in memory (bytes)
        uchar *attrib2; // pointer to area after constant pool (accessFlags)
        uint16 numConstants;
        uint16 numFields;
        uint16 numMethods;
} WClassA;

typedef struct WClassStrucB {
        uint16 numVars; // computed number of object variables
} WClassB;

typedef struct WClassStruct {
        struct WClassStruct **superClasses; // array of this classes superclasses
        WClassA* firstPart;
        WClassB* secondPart;
        struct WClassStruct *nextClass; // next class in hash table linked list
} WClass;

typedef struct UtfStringStruct {
        char *str;
        uint32 len;
} UtfString;

static WClass* getClass(UtfString className);
static UtfString* createUtfString(char *buf);

int main() {
        WClass* stringClass;
        UtfString* pJavaLangString;

        pJavaLangString = createUtfString("java/lang/String");
        stringClass = getClass(*pJavaLangString);

        return 0;
}

static WClass* getClass(UtfString className) {
        return NULL;
}

static UtfString* createUtfString(char *buf) {
        UtfString s;

        s.str = buf;

        return (UtfString*)malloc(sizeof(UtfString));
}