[or-cvs] Turn tor_strpartion into a swiss-army-knife function, so it...
Nick Mathewson
nickm at seul.org
Thu Oct 7 21:37:08 UTC 2004
Update of /home/or/cvsroot/src/common
In directory moria.mit.edu:/tmp/cvs-serv20169/src/common
Modified Files:
crypto.c util.c util.h
Log Message:
Turn tor_strpartion into a swiss-army-knife function, so it can terminate or not-terminate appropriately.
Index: crypto.c
===================================================================
RCS file: /home/or/cvsroot/src/common/crypto.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -d -r1.107 -r1.108
--- crypto.c 7 Oct 2004 20:58:52 -0000 1.107
+++ crypto.c 7 Oct 2004 21:37:06 -0000 1.108
@@ -514,9 +514,8 @@
}
/* base64_decode doesn't work unless we insert linebreaks every 64
* characters. how dumb. */
- if (tor_strpartition(partitioned, sizeof(partitioned), in, "\n", 64))
- return NULL;
- if (strlcat(partitioned, "\n",sizeof(partitioned))>=sizeof(partitioned))
+ if (tor_strpartition(partitioned, sizeof(partitioned), in, "\n", 64,
+ ALWAYS_TERMINATE))
return NULL;
len = base64_decode(buf, sizeof(buf), partitioned, strlen(partitioned));
if (len<0) {
@@ -919,7 +918,9 @@
}
base16_encode(hexdigest,sizeof(hexdigest),digest,DIGEST_LEN);
if (add_space) {
- tor_strpartition(fp_out, FINGERPRINT_LEN+1, hexdigest, " ", 4);
+ if (tor_strpartition(fp_out, FINGERPRINT_LEN+1, hexdigest, " ", 4,
+ NEVER_TERMINATE)<0)
+ return -1;
} else {
strcpy(fp_out, hexdigest);
}
Index: util.c
===================================================================
RCS file: /home/or/cvsroot/src/common/util.c,v
retrieving revision 1.137
retrieving revision 1.138
diff -u -d -r1.137 -r1.138
--- util.c 7 Oct 2004 20:58:53 -0000 1.137
+++ util.c 7 Oct 2004 21:37:06 -0000 1.138
@@ -219,25 +219,56 @@
/** Set the <b>dest_len</b>-byte buffer <b>buf</b> to contain the
* string <b>s</b>, with the string <b>insert</b> inserted after every
* <b>n</b> characters. Return 0 on success, -1 on failure.
+ *
+ * If <b>rule</b> is ALWAYS_TERMINATE, then always end the string with
+ * <b>insert</b>, even if its length is not a multiple of <b>n</b>. If
+ * <b>rule</b> is NEVER_TERMINATE, then never end the string with
+ * <b>insert</b>, even if its length <i>is</i> a multiple of <b>n</b>.
+ * If <b>rule</b> is TERMINATE_IF_EVEN, then end the string with <b>insert</b>
+ * exactly when its length <i>is</i> a multiple of <b>n</b>.
*/
int tor_strpartition(char *dest, size_t dest_len,
- const char *s, const char *insert, size_t n)
+ const char *s, const char *insert, size_t n,
+ part_finish_rule_t rule)
{
tor_assert(s && insert && n > 0);
+ char *destp;
int len_in, len_out, len_ins;
+ int is_even;
len_in = strlen(s);
len_ins = strlen(insert);
len_out = len_in + (len_in/n)*len_ins;
+ is_even = (len_in%n) == 0;
+ switch(rule)
+ {
+ case ALWAYS_TERMINATE:
+ if (!is_even) len_out += len_ins;
+ break;
+ case NEVER_TERMINATE:
+ if (is_even && len_in) len_out -= len_ins;
+ break;
+ case TERMINATE_IF_EVEN:
+ break;
+ }
if (dest_len < len_out+1)
return -1;
+ destp = dest;
while(len_in) {
- strncpy(dest, s, n);
+ strncpy(destp, s, n);
len_in -= n;
- if (len_in < 0) break;
- strcpy(dest+n, insert);
+ if (len_in < 0) {
+ if (rule == ALWAYS_TERMINATE)
+ strcpy(destp+n+len_in,insert);
+ break;
+ } else if (len_in == 0 && rule == NEVER_TERMINATE) {
+ *(destp+n) = '\0';
+ break;
+ }
+ strcpy(destp+n, insert);
s += n;
- dest += n+len_ins;
+ destp += n+len_ins;
}
+ tor_assert(len_out == strlen(dest));
return 0;
}
Index: util.h
===================================================================
RCS file: /home/or/cvsroot/src/common/util.h,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -d -r1.91 -r1.92
--- util.h 7 Oct 2004 20:58:53 -0000 1.91
+++ util.h 7 Oct 2004 21:37:06 -0000 1.92
@@ -88,8 +88,12 @@
void tor_strlower(char *s);
int strcmpstart(const char *s1, const char *s2);
int tor_strstrip(char *s, const char *strip);
+typedef enum {
+ ALWAYS_TERMINATE, NEVER_TERMINATE, TERMINATE_IF_EVEN
+} part_finish_rule_t;
int tor_strpartition(char *dest, size_t dest_len,
- const char *s, const char *insert, size_t n);
+ const char *s, const char *insert, size_t n,
+ part_finish_rule_t rule);
/* Some platforms segfault when you try to access a multi-byte type
More information about the tor-commits
mailing list