diff options
author | Sergiu Ivanov <unlimitedscolobb@gmail.com> | 2009-01-22 21:16:49 +0200 |
---|---|---|
committer | Sergiu Ivanov <unlimitedscolobb@gmail.com> | 2009-01-22 21:16:49 +0200 |
commit | 65360480a9540e3ed6cfdbc42a3a66c8b08b73dc (patch) | |
tree | b34379878c363aaf6a40d9a6510c48ed0ba2ed50 | |
parent | 439bd02eb00358b50e2d5123ae27e839d8f1a8a6 (diff) |
Added the routines for parsing magic syntax
Now nsmux has two special routines for parsing the special
``,,'' syntax: magic_find_sep and magic_unescape. The reason
for their separate existence is that the magic ``,,'' is
allowed to be escaped in the following way ``,,,'' and nsmux
must be able to react correspondingly to such syntax.
-rw-r--r-- | magic.c | 82 | ||||
-rw-r--r-- | magic.h | 39 | ||||
-rw-r--r-- | nsmux.c | 1 | ||||
-rw-r--r-- | options.h | 2 |
4 files changed, 124 insertions, 0 deletions
diff --git a/magic.c b/magic.c new file mode 100644 index 000000000..e50eda169 --- /dev/null +++ b/magic.c @@ -0,0 +1,82 @@ +/*---------------------------------------------------------------------------*/ +/*magic.h*/ +/*---------------------------------------------------------------------------*/ +/*Declaration of functions for handling the magic syntax.*/ +/*---------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +#include <string.h> +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +#include "magic.h" +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +/*---------Functions---------------------------------------------------------*/ +/*Locates the first unescaped magic separator in the supplied file + name. Returns NULL in case it finds nothing.*/ +char * magic_find_sep (const char * name) +{ + /*The position of the separator */ + char * sep = NULL; + + /*Go through all occurrences of the separator sequence */ + for (sep = strstr (name, ",,"); sep; sep = strstr (sep, ",,")) + { + /*if the current separator is not escaped, stop */ + if (sep[2] != ',') + break; + + sep += 2; + } + + return sep; +} /*magic_process_find_sep */ + +/*---------------------------------------------------------------------------*/ +/*Unescapes escaped separators in the substring of the file name + starting at `name` of length `sz`.*/ +void magic_unescape (char * name, int sz) +{ + /*A pointer for string operations */ + char * str = NULL; + + /*The position of the escaped separator */ + char * esc = NULL; + + /*Go through all occurrences of the separator sequence. Note that we + would like the whole separator to be enclosed in the substring of + length `sz`, hence the +2. */ + for + ( + esc = strstr (name, ",,,"); esc && (esc - name + 2 < sz); + esc = strstr (esc, ",,,") + ) + { + /*we've found and escaped separator; remove the escaping comma + from the string */ + for (str = ++esc; *str; str[-1] = *str, ++str); + str[-1] = 0; + --sz; + } +} /*magic_unescape */ +/*---------------------------------------------------------------------------*/ diff --git a/magic.h b/magic.h new file mode 100644 index 000000000..0e97f5b2b --- /dev/null +++ b/magic.h @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------*/ +/*magic.h*/ +/*---------------------------------------------------------------------------*/ +/*Declaration of functions for handling the magic syntax.*/ +/*---------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*---------------------------------------------------------------------------*/ +#ifndef __MAGIC_H__ +#define __MAGIC_H__ + +/*---------------------------------------------------------------------------*/ +/*---------Functions---------------------------------------------------------*/ +/*Locates the first unescaped magic separator in the supplied file + name. Returns NULL in case it finds nothing.*/ +char * magic_find_sep (const char * name); +/*---------------------------------------------------------------------------*/ +/*Unescapes escaped separators in the substring of the file name + starting at `name` of length `sz`.*/ +void magic_unescape (char * name, int sz); +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +#endif /*__LIB_H__*/ @@ -1586,3 +1586,4 @@ int main (int argc, char **argv) } /*main */ /*---------------------------------------------------------------------------*/ + @@ -28,6 +28,8 @@ /*---------------------------------------------------------------------------*/ /*--------Macros-------------------------------------------------------------*/ +/*Command Line Options*/ + /*The possible short options*/ #define OPT_CACHE_SIZE 'c' /*---------------------------------------------------------------------------*/ |