* byte after the end of the content will always be NUL.
*
* Example:
- * #include <ccan/str_talloc/str_talloc.h>
- * #include <ccan/talloc/talloc.h>
- * ...
- * // Return all of standard input, as lines.
- * static char **read_stdin_as_lines(void)
+ * // Return the first line.
+ * static char *read_stdin_firstline(void)
* {
- * char **lines, *all;
+ * char *all, *nl;
*
* all = grab_fd(NULL, 0, NULL);
* if (!all)
* return NULL;
- * lines = strsplit(NULL, all, "\n");
- * talloc_free(all);
- * return lines;
+ * nl = strchr(all, '\n');
+ * if (nl)
+ * *nl = '\0';
+ * return all;
* }
*/
void *grab_fd(const void *ctx, int fd, size_t *size);
* after the end of the content will always be NUL.
*
* Example:
- * // Return all of a given file, as lines.
- * static char **read_file_as_lines(const char *filename)
+ * static char *read_file_firstline(const char *filename)
* {
- * char **lines, *all;
+ * char *nl, *all;
*
* all = grab_file(NULL, filename, NULL);
* if (!all)
* return NULL;
- * lines = strsplit(NULL, all, "\n");
- * talloc_free(all);
- * return lines;
+ * nl = strchr(all, '\n');
+ * if (nl)
+ * *nl = '\0';
+ * return all;
* }
*/
void *grab_file(const void *ctx, const char *filename, size_t *size);
#include <sys/stat.h>
#include <ccan/grab_file/grab_file.c>
#include <ccan/tap/tap.h>
-#include <ccan/str_talloc/str_talloc.h>
+#include <string.h>
+
+static char **strsplit(const void *ctx, const char *string, const char *delims)
+{
+ char **lines = NULL;
+ unsigned int max = 64, num = 0;
+
+ lines = talloc_array(ctx, char *, max+1);
+
+ while (*string != '\0') {
+ unsigned int len = strcspn(string, delims);
+ lines[num] = talloc_array(lines, char, len + 1);
+ memcpy(lines[num], string, len);
+ lines[num][len] = '\0';
+ string += len;
+ string += strspn(string, delims) ? 1 : 0;
+ if (++num == max)
+ lines = talloc_realloc(ctx, lines, char *, max*=2 + 1);
+ }
+ lines[num] = NULL;
+
+ /* Shrink, so talloc_get_size works */
+ return talloc_realloc(ctx, lines, char *, num+1);
+}
int
main(int argc, char *argv[])