summaryrefslogtreecommitdiffstats
path: root/lib/elstring.c
diff options
context:
space:
mode:
authorChris Hall <chris.hall@highwayman.com>2011-03-31 00:37:47 +0100
committerChris Hall <chris.hall@highwayman.com>2011-03-31 00:37:47 +0100
commit9a9466f1fdad6fb6c94c5ef8ddb1a687a7bcd874 (patch)
treec4ae426872560a5e070f2054072607f2578e1f7d /lib/elstring.c
parentf3255d1e9f062e7783b05ab5b32ca70085170d79 (diff)
downloadquagga-9a9466f1fdad6fb6c94c5ef8ddb1a687a7bcd874.tar.bz2
quagga-9a9466f1fdad6fb6c94c5ef8ddb1a687a7bcd874.tar.xz
Small improvements to speed of reading of configuration file.
Tidy up signalling of "ready" to command loop, and checking of appropriate state to close written configuration file.
Diffstat (limited to 'lib/elstring.c')
-rw-r--r--lib/elstring.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/lib/elstring.c b/lib/elstring.c
index 64756a64..51089cdd 100644
--- a/lib/elstring.c
+++ b/lib/elstring.c
@@ -77,23 +77,13 @@ els_free(elstring els)
*/
/*------------------------------------------------------------------------------
- * Compare two elstrings -- returns the usual -ve, 0, +ve cmp result.
- *
- * NULL elstring is treated as empty.
+ * Basic string/length vs string/length comparison
*/
-extern int
-els_cmp(elstring a, elstring b)
+inline static int
+str_nn_cmp(const uchar* ap, ulen al, const uchar* bp, ulen bl)
{
- const uchar* ap ;
- const uchar* bp ;
- ulen al, bl ;
ulen n ;
- ap = els_body(a) ; /* NULL if a is NULL */
- bp = els_body(b) ;
- al = els_len(a) ; /* zero if a is NULL */
- bl = els_len(b) ;
-
n = (al <= bl) ? al : bl ; /* min(al, bl) */
while (n)
@@ -108,7 +98,29 @@ els_cmp(elstring a, elstring b)
} ;
/*------------------------------------------------------------------------------
- * Compare elstring against word.
+ * Compare two elstrings -- returns the usual -ve, 0, +ve cmp result.
+ *
+ * NULL elstring is treated as empty.
+ */
+extern int
+els_cmp(elstring a, elstring b)
+{
+ return str_nn_cmp(els_body(a), els_len(a), els_body(b), els_len(b)) ;
+} ;
+
+/*------------------------------------------------------------------------------
+ * Compare two string/length values -- returns the usual -ve, 0, +ve cmp result
+ *
+ * (Not really an elstring function, but the infrastructure is here.)
+ */
+extern int
+els_nn_cmp(const void* ap, ulen al, const void* bp, ulen bl)
+{
+ return str_nn_cmp(ap, al, bp, bl) ;
+} ;
+
+/*------------------------------------------------------------------------------
+ * Compare elstring against word elstring.
*
* Returns: -1 => elstring and word match to end of elstring
* 0 => elstring and word match completely
@@ -120,13 +132,13 @@ els_cmp(elstring a, elstring b)
* An empty elstring will partly match any non-empty word.
*/
extern int
-els_cmp_word(elstring a, const char* w)
+els_cmp_word(elstring a, elstring w)
{
- const uchar* ap, * ep ;
+ const uchar* ap, * ep, * wp ;
ulen al, wl ;
al = els_len(a) ; /* zero if a is NULL */
- wl = (w != NULL) ? strlen(w) : 0 ; /* zero if w is NULL */
+ wl = els_len(w) ; /* zero if w is NULL */
if (al > wl)
return +1 ; /* no match if longer */
@@ -135,16 +147,17 @@ els_cmp_word(elstring a, const char* w)
return (wl == 0) ? 0 : -1 ; /* exact or partial if empty */
ap = els_body_nn(a) ;
+ wp = els_body_nn(w) ;
/* Neither string is empty */
- if (*ap != *w)
+ if (*ap != *wp)
return +1 ; /* quick out if no match for 1st char */
ep = ap + al - 1 ;
while (ap < ep)
{
- if (*++ap != *++w)
+ if (*++ap != *++wp)
return 1 ;
} ;