in C (what a pain)
\nstruct word {\n    char sorted[256];\n    char s[256];\n    UT_hash_handle hh;\n};\n\nint comp(const void *aa, const void *bb)\n{\n    char a, b;\n    a = *(c
```\nstruct word {\n    char sorted[256];\n    char s[256];\n    UT_hash_handle hh;\n};\n\nint comp(const void *aa, const void *bb)\n{\n    char a, b;\n    a = *(char *)aa;\n    b = *(char *)bb;\n    \n    if (a < b)\n        return -1;\n    else if (a > b)\n        return 1;\n    else\n        return 0;\n}\n\nchar *sort_string(char *s)\n{\n    char *rs = malloc(strlen(s)+1);\n    assert(rs);\n    strcpy(rs, s);\n    qsort((void *)rs, strlen(rs), 1, comp);\n    return rs;\n}\n\nint word_sort(struct word *a, struct word *b) {\n    return strcmp(a->sorted,b->sorted);\n}\n\n\n/**\n * Return an array of arrays of size *returnSize.\n * The sizes of the arrays are returned as *returnColumnSizes array.\n * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().\n */\nchar *** groupAnagrams(char ** strs, int strsSize, int* returnSize, int** returnColumnSizes){\n    struct word *w, *tmp;\n    int i;\n    struct word *words = NULL;\n    \n    for (i = 0; i < strsSize; i++) {\n        char *sorted = sort_string(strs[i]);\n        w = (struct word *)malloc(sizeof *w);\n        strncpy(w->sorted, sorted, 256);\n        strncpy(w->s, strs[i], 256);\n        HASH_ADD_STR( words, sorted, w );\n        free(sorted);\n    }\n    \n    char ***ret = malloc(strsSize * sizeof(char *));\n    int *retcolsizes = malloc(strsSize * sizeof(int));\n    *returnColumnSizes = retcolsizes;\n    assert(*returnColumnSizes);\n    assert(ret);\n    \n    *returnSize = -1;\n    char *anagram = NULL;\n    \n    /* XXX: what we would like is something like (python):\n     *      return dic.values();\n     * I know its C, but there has to be a better way.\n     */\n    HASH_SORT(words, word_sort);\n    HASH_ITER(hh, words, w, tmp) {\n        if (anagram != NULL && strcmp(w->sorted, anagram) == 0) {\n            ret[*returnSize][retcolsizes[*returnSize]] = w->s; // was malloc\'ed\n            retcolsizes[*returnSize] += 1;\n        } else {\n            *returnSize += 1;\n            ret[*returnSize] = malloc(strsSize * sizeof(char *));\n            assert(ret[*returnSize]);\n            retcolsizes[*returnSize] = 0;\n            ret[*returnSize][retcolsizes[*returnSize]] = w->s; // was malloc\'ed\n            retcolsizes[*returnSize] += 1;\n            anagram = w->sorted;\n        }\n    }\n    \n    /* XXX: we are leaking a bunch of memory for the struct word\'s*/\n    *returnSize += 1;\n    return ret;\n}\n```
['C']