diff options
-rw-r--r-- | configure.in | 9 | ||||
-rw-r--r-- | include/osmocore/Makefile.am | 2 | ||||
-rw-r--r-- | include/osmocore/msgfile.h | 49 | ||||
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/msgfile.c | 118 | ||||
-rw-r--r-- | tests/Makefile.am | 3 | ||||
-rw-r--r-- | tests/msgfile/Makefile.am | 5 | ||||
-rw-r--r-- | tests/msgfile/msgconfig.cfg | 1 | ||||
-rw-r--r-- | tests/msgfile/msgfile_test.c | 50 |
9 files changed, 240 insertions, 1 deletions
diff --git a/configure.in b/configure.in index 1684aaa3..4c827b06 100644 --- a/configure.in +++ b/configure.in @@ -88,6 +88,14 @@ then AC_DEFINE([BSC_FD_CHECK],[1],[Instrument the bsc_register_fd]) fi +AC_ARG_ENABLE(msgfile, + [AS_HELP_STRING( + [--disable-msgfile], + [Disable support for the msgfile], + )], + [enable_msgfile=0], [enable_msgfile=1]) +AM_CONDITIONAL(ENABLE_MSGFILE, test "x$enable_msgfile" = "x1") + AC_OUTPUT( libosmocore.pc @@ -103,4 +111,5 @@ AC_OUTPUT( tests/Makefile tests/timer/Makefile tests/sms/Makefile + tests/msgfile/Makefile Makefile) diff --git a/include/osmocore/Makefile.am b/include/osmocore/Makefile.am index 74102bdb..2efaa96b 100644 --- a/include/osmocore/Makefile.am +++ b/include/osmocore/Makefile.am @@ -2,7 +2,7 @@ osmocore_HEADERS = signal.h linuxlist.h timer.h select.h msgb.h \ tlv.h bitvec.h comp128.h statistics.h gsm_utils.h utils.h \ gsmtap.h write_queue.h rsl.h gsm48.h rxlev_stat.h mncc.h \ gsm48_ie.h logging.h gsm0808.h rate_ctr.h gsmtap_util.h \ - plugin.h crc16.h panic.h process.h gsm0480.h + plugin.h crc16.h panic.h process.h gsm0480.h msgfile.h if ENABLE_TALLOC osmocore_HEADERS += talloc.h diff --git a/include/osmocore/msgfile.h b/include/osmocore/msgfile.h new file mode 100644 index 00000000..92caa9fc --- /dev/null +++ b/include/osmocore/msgfile.h @@ -0,0 +1,49 @@ +/* + * (C) 2010 by Holger Hans Peter Freyther + * (C) 2010 by On-Waves + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#ifndef MSG_FILE_H +#define MSG_FILE_H + +#include "linuxlist.h" + +/** + * One message in the list. + */ +struct msg_entry { + struct llist_head list; + + /* number for everyone to use */ + int nr; + + /* data from the file */ + char *mcc; + char *mnc; + char *option; + char *text; +}; + +struct msg_entries { + struct llist_head entry; +}; + +struct msg_entries *msg_entry_parse(void *ctx, const char *filename); + +#endif diff --git a/src/Makefile.am b/src/Makefile.am index 288a0b92..d1a12b73 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,3 +23,7 @@ endif if ENABLE_TALLOC libosmocore_la_SOURCES += talloc.c endif + +if ENABLE_MSGFILE +libosmocore_la_SOURCES += msgfile.c +endif diff --git a/src/msgfile.c b/src/msgfile.c new file mode 100644 index 00000000..051f5b75 --- /dev/null +++ b/src/msgfile.c @@ -0,0 +1,118 @@ +/* + * Parse a simple file with messages, e.g used for USSD messages + * + * (C) 2010 by Holger Hans Peter Freyther + * (C) 2010 by On-Waves + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <osmocore/msgfile.h> +#include <osmocore/talloc.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <string.h> + +static struct msg_entry *alloc_entry(struct msg_entries *entries, + const char *mcc, const char *mnc, + const char *option, const char *text) +{ + struct msg_entry *entry = talloc_zero(entries, struct msg_entry); + if (!entry) + return NULL; + + entry->mcc = talloc_strdup(entry, mcc); + entry->mnc = talloc_strdup(entry, mnc); + entry->option = talloc_strdup(entry, option); + entry->text = talloc_strdup(entry, text); + + llist_add_tail(&entry->list, &entries->entry); + return entry; +} + +static struct msg_entries *alloc_entries(void *ctx) +{ + struct msg_entries *entries; + + entries = talloc_zero(ctx, struct msg_entries); + if (!entries) + return NULL; + + INIT_LLIST_HEAD(&entries->entry); + return entries; +} + +/* + * split a line like 'foo:Text'. + */ +static void handle_line(struct msg_entries *entries, char *line) +{ + int i; + const int len = strlen(line); + + char *items[3]; + int last_item = 0; + + for (i = 0; i < len; ++i) { + if (line[i] == '\n' || line[i] == '\r') + line[i] = '\0'; + else if (line[i] == ':' && last_item < 3) { + line[i] = '\0'; + + items[last_item++] = &line[i + 1]; + } + } + + if (last_item == 3) { + alloc_entry(entries, &line[0] , items[0], items[1], items[2]); + return; + } + + /* nothing found */ +} + +struct msg_entries *msg_entry_parse(void *ctx, const char *filename) +{ + struct msg_entries *entries; + size_t n; + char *line; + FILE *file; + + file = fopen(filename, "r"); + if (!file) + return NULL; + + entries = alloc_entries(ctx); + if (!entries) { + fclose(file); + return NULL; + } + + n = 2342; + line = NULL; + while (getline(&line, &n, file) != -1) { + handle_line(entries, line); + free(line); + line = NULL; + } + + fclose(file); + return entries; +} diff --git a/tests/Makefile.am b/tests/Makefile.am index 0119a02c..14c8ca87 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,3 +1,6 @@ if ENABLE_TESTS SUBDIRS = timer sms +if ENABLE_MSGFILE +SUBDIRS += msgfile +endif endif diff --git a/tests/msgfile/Makefile.am b/tests/msgfile/Makefile.am new file mode 100644 index 00000000..c9f4bec2 --- /dev/null +++ b/tests/msgfile/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = $(all_includes) -I$(top_srcdir)/include +noinst_PROGRAMS = msgfile_test + +msgfile_test_SOURCES = msgfile_test.c +msgfile_test_LDADD = $(top_builddir)/src/libosmocore.la diff --git a/tests/msgfile/msgconfig.cfg b/tests/msgfile/msgconfig.cfg new file mode 100644 index 00000000..dfaad299 --- /dev/null +++ b/tests/msgfile/msgconfig.cfg @@ -0,0 +1 @@ +*:*::Hello Welt diff --git a/tests/msgfile/msgfile_test.c b/tests/msgfile/msgfile_test.c new file mode 100644 index 00000000..a82ac516 --- /dev/null +++ b/tests/msgfile/msgfile_test.c @@ -0,0 +1,50 @@ +/* + * (C) 2010 by Holger Hans Peter Freyther + * (C) 2010 by On-Waves + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <osmocore/msgfile.h> + +#include <stdio.h> + +static void dump_entries(struct msg_entries *entries) +{ + struct msg_entry *entry; + + if (!entries) { + fprintf(stderr, "Failed to parse the file\n"); + return; + } + + llist_for_each_entry(entry, &entries->entry, list) { + printf("Entry '%s:%s:%s:%s'\n", + entry->mcc, entry->mnc, entry->option, entry->text); + } +} + +int main(int argc, char **argv) +{ + struct msg_entries *entries; + + /* todo use msgfile_test.c.in and replace the path */ + entries = msg_entry_parse(NULL, "msgconfig.cfg"); + dump_entries(entries); + + return 0; +} |