From: Lucas De Marchi Date: Tue, 29 Nov 2011 20:05:43 +0000 (-0200) Subject: Add getline_wrapped() to parse config files X-Git-Tag: v1~179 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4462c4ac602e7c236907b32a807e14ffa2d0be83;p=thirdparty%2Fkmod.git Add getline_wrapped() to parse config files Basically copied from module-init-tools --- diff --git a/Makefile.am b/Makefile.am index 4a0f09bd..9da04547 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,6 +33,7 @@ libkmod_libkmod_la_SOURCES =\ libkmod/libkmod.c \ libkmod/libkmod-list.c \ libkmod/libkmod-loaded.c \ + libkmod/libkmod-util.c \ libkmod/libkmod-module.c EXTRA_DIST += libkmod/libkmod.sym diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h index 20da5610..b22896dc 100644 --- a/libkmod/libkmod-private.h +++ b/libkmod/libkmod-private.h @@ -2,6 +2,7 @@ #define _LIBKMOD_PRIVATE_H_ #include +#include #include #include "macro.h" @@ -53,4 +54,6 @@ struct kmod_list *kmod_list_remove_data(struct kmod_list *list, const char *kmod_get_dirname(struct kmod_ctx *ctx) __attribute__((nonnull(1))); +char *getline_wrapped(FILE *fp, unsigned int *linenum); + #endif diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c new file mode 100644 index 00000000..a1f5fa10 --- /dev/null +++ b/libkmod/libkmod-util.c @@ -0,0 +1,85 @@ +/* + * libkmod - interface to kernel module operations + * + * Copyright (C) 2011 ProFUSION embedded systems + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libkmod.h" +#include "libkmod-private.h" + +/* + * Read one logical line from a configuration file. + * + * Line endings may be escaped with backslashes, to form one logical line from + * several physical lines. No end of line character(s) are included in the + * result. + * + * If linenum is not NULL, it is incremented by the number of physical lines + * which have been read. + */ +char *getline_wrapped(FILE *fp, unsigned int *linenum) +{ + int size = 256; + int i = 0; + char *buf = malloc(size); + for(;;) { + int ch = getc_unlocked(fp); + + switch(ch) { + case EOF: + if (i == 0) { + free(buf); + return NULL; + } + /* else fall through */ + + case '\n': + if (linenum) + (*linenum)++; + if (i == size) + buf = realloc(buf, size + 1); + buf[i] = '\0'; + return buf; + + case '\\': + ch = getc_unlocked(fp); + + if (ch == '\n') { + if (linenum) + (*linenum)++; + continue; + } + /* else fall through */ + + default: + buf[i++] = ch; + + if (i == size) { + size *= 2; + buf = realloc(buf, size); + } + } + } +}