static int strncasecmp_terminator (const char *left, const char *right) { size_t left_len = strlen (left); size_t right_len = strlen (right); return strncasecmp (left, right, max_size_t (left_len, right_len)); }
size_t Types_GetSizeOf(const tType *Type) { // TODO: machine sizes switch(Type->Class) { case TYPECLASS_VOID: return 0; case TYPECLASS_INTEGER: switch(Type->Integer.Size) { case INTSIZE_BOOL: return 1; case INTSIZE_CHAR: return 1; case INTSIZE_SHORT: return 2; case INTSIZE_INT: return 4; case INTSIZE_LONG: return 4; case INTSIZE_LONGLONG: return 8; } break; case TYPECLASS_REAL: switch(Type->Real.Size) { case FLOATSIZE_FLOAT: return 4; case FLOATSIZE_DOUBLE: return 8; case FLOATSIZE_LONGDOUBLE: return 10; } break; case TYPECLASS_POINTER: return 4; case TYPECLASS_ARRAY: return Type->Array.Count * Types_GetSizeOf(Type->Array.Type); case TYPECLASS_STRUCTURE: { size_t ret = 0; for(int i = 0; i < Type->StructUnion->nFields; i ++ ) ret += Types_GetSizeOf(Type->StructUnion->Entries[i].Type); return ret; } case TYPECLASS_UNION: { size_t ret = 0; for(int i = 0; i < Type->StructUnion->nFields; i ++ ) ret = max_size_t(ret, Types_GetSizeOf(Type->StructUnion->Entries[i].Type)); return ret; } case TYPECLASS_ENUM: if( Type->Enum->Max == 0 ) return 0; if( Type->Enum->Max < 256 ) return 1; if( Type->Enum->Max < 256*256 ) return 2; return 4; case TYPECLASS_FUNCTION: // Function can't be 'sizeof'd return 0; } return 0; }