#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORDS 10
#define TEST(s) { \
char *str = make_string(s); \
puts(str); \
free(str); \
}
static size_t words_count = 0;
static const char *words[MAX_WORDS] = { 0 };
int cmp_str(const void *p1, const void *p2)
{ return strlen(*(const char **) p1
) < strlen(*(const char **) p2
); }
void add_word(const char *word)
{
if (words_count < MAX_WORDS)
words[words_count++] = word;
else {
puts("error: too much words!"); }
}
char *get_word(char *str)
{
char *ret;
if (str == NULL || *str == 0)
return NULL;
++str;
ret = str;
++str;
*str = 0;
return *ret ? ret : NULL;
}
char *make_string(const char *source_str)
{
size_t i;
char *ret;
char *word;
char *str;
words_count = 0;
str
= alloca
(strlen(source_str
) + 2); str
[strlen(source_str
) + 1] = 0;
while ((word = get_word(str)) != NULL) {
add_word(word);
str
= word
+ strlen(word
) + 1; }
qsort(words
, words_count
, sizeof(char *), cmp_str
);
for (i = 0; i < words_count; i++) {
if (i != words_count - 1)
}
return ret;
}
int main()
{
TEST("hello");
TEST(" hell, world ");
TEST(" my other car is cdr ");
TEST(" the quick brown fox, jumps over the, lazy dog ");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBNQVhfV09SRFMgMTAKCiNkZWZpbmUgVEVTVChzKSB7IFwKICAgIGNoYXIgKnN0ciA9IG1ha2Vfc3RyaW5nKHMpOyBcCiAgICBwdXRzKHN0cik7IFwKICAgIGZyZWUoc3RyKTsgXAp9CgpzdGF0aWMgc2l6ZV90IHdvcmRzX2NvdW50ID0gMDsKc3RhdGljIGNvbnN0IGNoYXIgKndvcmRzW01BWF9XT1JEU10gPSB7IDAgfTsKCmludCBjbXBfc3RyKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKeyByZXR1cm4gc3RybGVuKCooY29uc3QgY2hhciAqKikgcDEpIDwgc3RybGVuKCooY29uc3QgY2hhciAqKikgcDIpOyB9Cgp2b2lkIGFkZF93b3JkKGNvbnN0IGNoYXIgKndvcmQpCnsKICAgIGlmICh3b3Jkc19jb3VudCA8IE1BWF9XT1JEUykKICAgICAgICB3b3Jkc1t3b3Jkc19jb3VudCsrXSA9IHdvcmQ7CiAgICBlbHNlIHsKICAgICAgICBwdXRzKCJlcnJvcjogdG9vIG11Y2ggd29yZHMhIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KfQoKY2hhciAqZ2V0X3dvcmQoY2hhciAqc3RyKQp7CiAgICBjaGFyICpyZXQ7CgogICAgaWYgKHN0ciA9PSBOVUxMIHx8ICpzdHIgPT0gMCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICB3aGlsZSAoKnN0ciAmJiAhaXNhbHBoYSgqc3RyKSkKICAgICAgICArK3N0cjsKCiAgICByZXQgPSBzdHI7CgogICAgd2hpbGUgKCpzdHIgJiYgaXNhbHBoYSgqc3RyKSkKICAgICAgICArK3N0cjsKICAgICpzdHIgPSAwOwoKICAgIHJldHVybiAqcmV0ID8gcmV0IDogTlVMTDsKfQoKY2hhciAqbWFrZV9zdHJpbmcoY29uc3QgY2hhciAqc291cmNlX3N0cikKewogICAgc2l6ZV90IGk7CiAgICBjaGFyICpyZXQ7CiAgICBjaGFyICp3b3JkOwogICAgY2hhciAqc3RyOwoKICAgIHdvcmRzX2NvdW50ID0gMDsKICAgIHN0ciA9IGFsbG9jYShzdHJsZW4oc291cmNlX3N0cikgKyAyKTsKICAgIHN0cmNweShzdHIsIHNvdXJjZV9zdHIpOwogICAgc3RyW3N0cmxlbihzb3VyY2Vfc3RyKSArIDFdID0gMDsKCiAgICB3aGlsZSAoKHdvcmQgPSBnZXRfd29yZChzdHIpKSAhPSBOVUxMKSB7CiAgICAgICAgYWRkX3dvcmQod29yZCk7CiAgICAgICAgc3RyID0gd29yZCArIHN0cmxlbih3b3JkKSArIDE7CiAgICB9CgogICAgcXNvcnQod29yZHMsIHdvcmRzX2NvdW50LCBzaXplb2YoY2hhciAqKSwgY21wX3N0cik7CgogICAgcmV0ID0gY2FsbG9jKHN0cmxlbihzb3VyY2Vfc3RyKSArIDEsIDEpOwogICAgZm9yIChpID0gMDsgaSA8IHdvcmRzX2NvdW50OyBpKyspIHsKICAgICAgICBzdHJjYXQocmV0LCB3b3Jkc1tpXSk7CgogICAgICAgIGlmIChpICE9IHdvcmRzX2NvdW50IC0gMSkKICAgICAgICAgICAgc3RyY2F0KHJldCwgIiAiKTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgppbnQgbWFpbigpCnsKICAgIFRFU1QoImhlbGxvIik7CiAgICBURVNUKCIgaGVsbCwgd29ybGQgIik7CiAgICBURVNUKCIgICAgICBteSBvdGhlciAgICBjYXIgaXMgY2RyICAgIik7CiAgICBURVNUKCIgIHRoZSBxdWljayAgIGJyb3duIGZveCwgIGp1bXBzIG92ZXIgIHRoZSwgbGF6eSBkb2cgICAiKTsKICAgIHJldHVybiAwOwp9Cg==