#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>
struct size_t_elem {
size_t lu;
struct size_t_elem *next;
};
/* List structure requiring manual bookkeeping for size */
struct size_t_list {
uint32_t size;
const struct size_t_elem *list;
};
struct size_t_elem **size_t_list_end(struct size_t_elem **size_t_elem) {
while (*size_t_elem)
size_t_elem = &size_t_elem[0]->next;
return size_t_elem;
}
struct size_t_elem **size_t_list_prepend(struct size_t_elem **size_t_elem,
const size_t lu) {
struct size_t_elem
*x
= malloc(sizeof *x
); if (!x)
return NULL;
x->lu = lu;
x->next = *size_t_elem;
*size_t_elem = x;
return &x->next;
}
struct size_t_elem **size_t_list_append(struct size_t_elem **p,
const size_t lu) {
return size_t_list_prepend(size_t_list_end(p), lu);
}
void size_t_list_push(uint32_t *ll_n,
struct size_t_elem ***ll_root,
const size_t lu) {
(*ll_n)++;
*ll_root = size_t_list_append(*ll_root, lu);
}
int main(void) {
struct size_t_elem *full_ll = NULL;
struct size_t_elem **ll_cur_ptr = &full_ll, *iter;
struct size_t_list
*ll
= malloc(sizeof *ll
);
const size_t l[] = {5, 6, 10, 44};
size_t i;
for(i=0; i<sizeof l/sizeof l[0]; i++)
size_t_list_push(&ll->size, &ll_cur_ptr, l[i]);
for (iter = (struct size_t_elem *)ll->list, i=0; iter != NULL; iter = iter->next, i++)
printf("ll->list[%lu] = %lu\n", i
, iter
->lu
);
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgpzdHJ1Y3Qgc2l6ZV90X2VsZW0gewogIHNpemVfdCBsdTsKICBzdHJ1Y3Qgc2l6ZV90X2VsZW0gKm5leHQ7Cn07CgovKiBMaXN0IHN0cnVjdHVyZSByZXF1aXJpbmcgbWFudWFsIGJvb2trZWVwaW5nIGZvciBzaXplICovCnN0cnVjdCBzaXplX3RfbGlzdCB7CiAgdWludDMyX3Qgc2l6ZTsKICBjb25zdCBzdHJ1Y3Qgc2l6ZV90X2VsZW0gKmxpc3Q7Cn07CgpzdHJ1Y3Qgc2l6ZV90X2VsZW0gKipzaXplX3RfbGlzdF9lbmQoc3RydWN0IHNpemVfdF9lbGVtICoqc2l6ZV90X2VsZW0pIHsKICBhc3NlcnQoc2l6ZV90X2VsZW0pOwogIHdoaWxlICgqc2l6ZV90X2VsZW0pCiAgICBzaXplX3RfZWxlbSA9ICZzaXplX3RfZWxlbVswXS0+bmV4dDsKICByZXR1cm4gc2l6ZV90X2VsZW07Cn0KCnN0cnVjdCBzaXplX3RfZWxlbSAqKnNpemVfdF9saXN0X3ByZXBlbmQoc3RydWN0IHNpemVfdF9lbGVtICoqc2l6ZV90X2VsZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGx1KSB7CiAgc3RydWN0IHNpemVfdF9lbGVtICp4ID0gbWFsbG9jKHNpemVvZiAqeCk7CiAgYXNzZXJ0KHNpemVfdF9lbGVtKTsKICBpZiAoIXgpCiAgICByZXR1cm4gTlVMTDsKICB4LT5sdSA9IGx1OwogIHgtPm5leHQgPSAqc2l6ZV90X2VsZW07CiAgKnNpemVfdF9lbGVtID0geDsKICByZXR1cm4gJngtPm5leHQ7Cn0KCnN0cnVjdCBzaXplX3RfZWxlbSAqKnNpemVfdF9saXN0X2FwcGVuZChzdHJ1Y3Qgc2l6ZV90X2VsZW0gKipwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGx1KSB7CiAgcmV0dXJuIHNpemVfdF9saXN0X3ByZXBlbmQoc2l6ZV90X2xpc3RfZW5kKHApLCBsdSk7Cn0KCnZvaWQgc2l6ZV90X2xpc3RfcHVzaCh1aW50MzJfdCAqbGxfbiwKICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzaXplX3RfZWxlbSAqKipsbF9yb290LAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGx1KSB7CiAgKCpsbF9uKSsrOwogICpsbF9yb290ID0gc2l6ZV90X2xpc3RfYXBwZW5kKCpsbF9yb290LCBsdSk7Cn0KCmludCBtYWluKHZvaWQpIHsKICBzdHJ1Y3Qgc2l6ZV90X2VsZW0gKmZ1bGxfbGwgPSBOVUxMOwogIHN0cnVjdCBzaXplX3RfZWxlbSAqKmxsX2N1cl9wdHIgPSAmZnVsbF9sbCwgKml0ZXI7CgogIHN0cnVjdCBzaXplX3RfbGlzdCAqbGwgPSBtYWxsb2Moc2l6ZW9mICpsbCk7CgogIGNvbnN0IHNpemVfdCBsW10gPSB7NSwgNiwgMTAsIDQ0fTsKICBzaXplX3QgaTsKICBmb3IoaT0wOyBpPHNpemVvZiBsL3NpemVvZiBsWzBdOyBpKyspCiAgICBzaXplX3RfbGlzdF9wdXNoKCZsbC0+c2l6ZSwgJmxsX2N1cl9wdHIsIGxbaV0pOwoKICBmb3IgKGl0ZXIgPSAoc3RydWN0IHNpemVfdF9lbGVtICopbGwtPmxpc3QsIGk9MDsgaXRlciAhPSBOVUxMOyBpdGVyID0gaXRlci0+bmV4dCwgaSsrKQogICAgcHJpbnRmKCJsbC0+bGlzdFslbHVdID0gJWx1XG4iLCBpLCBpdGVyLT5sdSk7CgogIHJldHVybiBFWElUX1NVQ0NFU1M7Cn0K