]> code.citadel.org Git - citadel.git/commitdiff
* tools.c: Massively faster versions of extract_token() and remove_token().
authorMichael Hampton <io_error@uncensored.citadel.org>
Sat, 29 Jun 2002 18:36:31 +0000 (18:36 +0000)
committerMichael Hampton <io_error@uncensored.citadel.org>
Sat, 29 Jun 2002 18:36:31 +0000 (18:36 +0000)
  These functions can now handle multi-kilobyte sized strings with hundreds
  of tokens (or more?).

citadel/ChangeLog
citadel/tools.c

index fec946fa2d6db15d550f1297001552577af528f4..b55ef7a2743caa9c3663d194185d6feef68dbe43 100644 (file)
@@ -1,4 +1,9 @@
  $Log$
+ Revision 591.60  2002/06/29 18:36:31  error
+ * tools.c: Massively faster versions of extract_token() and remove_token().
+   These functions can now handle multi-kilobyte sized strings with hundreds
+   of tokens (or more?).
+
  Revision 591.59  2002/06/29 15:55:07  error
  * Convert whobbs, serv_info, misc. functions to new IPC code
 
@@ -3785,4 +3790,3 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
-
index 33c81592568f0f0626cddef3c32d29ff5c3778fd..e73a9b122d0738c9b189eac89503cb3df1322a3e 100644 (file)
@@ -83,10 +83,41 @@ int num_tokens(char *source, char tok) {
        return(count);
 }
 
+
+/* extract_token_fast() - a smarter string tokenizer */
+void extract_token(char *dest, char *source, int parmnum, char separator)
+{
+       char *d, *s;            /* dest, source */
+       int count = 0;
+
+       strcpy(dest, "");
+
+       /* Locate desired parameter */
+       s = source;
+       while (count < parmnum) {
+               /* End of string, bail! */
+               if (!*s) {
+                       s = NULL;
+                       break;
+               }
+               if (*s == separator) {
+                       count++;
+               }
+               s++;
+       }
+       if (!s) return;         /* Parameter not found */
+
+       for (d = dest; *s && *s != separator; s++, d++) {
+               *d = *s;
+       }
+       *d = 0;
+}
+
+
 /*
  * extract_token()  -  a smarter string tokenizer
  */
-void extract_token(char *dest, char *source, int parmnum, char separator) 
+void extract_token_old(char *dest, char *source, int parmnum, char separator) 
 {
        int i;
        int len;
@@ -113,10 +144,53 @@ void extract_token(char *dest, char *source, int parmnum, char separator)
 
 
 
+/* remove_token_fast() - a tokenizer that kills, maims, and destroys fast */
+void remove_token(char *source, int parmnum, char separator)
+{
+       char *d, *s;            /* dest, source */
+       int count = 0;
+
+       /* Find desired parameter */
+       d = source;
+       while (count < parmnum) {
+               /* End of string, bail! */
+               if (!*d) {
+                       d = NULL;
+                       break;
+               }
+               if (*d == separator) {
+                       count++;
+               }
+               d++;
+       }
+       if (!d) return;         /* Parameter not found */
+
+       /* Find next parameter */
+       s = d;
+       while (*s && *s != separator) {
+               s++;
+       }
+
+       /* Hack and slash */
+       if (*s)
+               strcpy(d, ++s);
+       else if (d == source)
+               *d = 0;
+       else
+               *--d = 0;
+       /*
+       while (*s) {
+               *d++ = *s++;
+       }
+       *d = 0;
+       */
+}
+
+
 /*
  * remove_token()  -  a tokenizer that kills, maims, and destroys
  */
-void remove_token(char *source, int parmnum, char separator)
+void remove_token_old(char *source, int parmnum, char separator)
 {
        int i;
        int len;