; char** create_string_list(int n) (define create-string-list (foreign-lambda (c-pointer c-pointer) "create_string_list" int)) ; void free_string_list(char** p, int n) (define free-string-list (foreign-lambda void "free_string_list" (c-pointer c-pointer) int)) ; void insert_string(char** l, int n, char* s) (define insert-string (foreign-lambda void "insert_string" (c-pointer c-pointer) int c-string)) ; void inspect_string_list(void* lv, int n) { (define inspect-string-list (foreign-lambda void "inspect_string_list" (c-pointer c-pointer) int)) void* create_string_list(int n) { if (n > 0) { return calloc(n+1, sizeof(char*)); /* Extra one for NULL */ } else { return NULL; } } void free_string_list(void* pv, int n) { int i; char** p = (char**)(pv); for (i = 0; i <= n; i++) { /* Free the extra one incase it got used. */ if (p[i]) free(p[i]); } free(p); } void insert_string(void* lv, int n, char* s) { char** l = (char**)(lv); l[n] = strdup((const char*)(s)); } void inspect_string_list(void* lv, int n) { int i; char** l = (char**)(lv); for (i = 0; i < n; i++) { printf("%d: <%s>\n", i, l[i]); } if (l[n]) printf("Not NULL terminated!\n"); else printf("NULL terminated!\n"); }