Re: [PATCH v2 2/6] string_list: add two new functions for splitting strings

2012-09-12 Thread Michael Haggerty
On 09/11/2012 12:33 AM, Junio C Hamano wrote:
 Michael Haggerty mhag...@alum.mit.edu writes:
 
 +`string_list_split`, `string_list_split_in_place`::
 +
 +Split a string into substrings on a delimiter character and
 +append the substrings to a `string_list`.  If `maxsplit` is
 +non-negative, then split at most `maxsplit` times.  Return the
 +number of substrings appended to the list.
 
 
 I recall that we favor
 
 `A`::
 `B`::
 
   Description for A and B
 
 for some reason but do not remember exactly why.

Will change.  Thanks.

Michael

-- 
Michael Haggerty
mhag...@alum.mit.edu
http://softwareswirl.blogspot.com/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/6] string_list: add two new functions for splitting strings

2012-09-12 Thread Junio C Hamano
Michael Haggerty mhag...@alum.mit.edu writes:

 On 09/11/2012 12:33 AM, Junio C Hamano wrote:
 Michael Haggerty mhag...@alum.mit.edu writes:
 
 +`string_list_split`, `string_list_split_in_place`::
 +
 +   Split a string into substrings on a delimiter character and
 +   append the substrings to a `string_list`.  If `maxsplit` is
 +   non-negative, then split at most `maxsplit` times.  Return the
 +   number of substrings appended to the list.
 
 
 I recall that we favor
 
 `A`::
 `B`::
 
  Description for A and B
 
 for some reason but do not remember exactly why.

 Will change.  Thanks.

Thanks.  It comes from this one:

commit bf474e2402e51843e8230c064da6ccfdf3a8ff54
Author: Markus Heidelberg markus.heidelb...@web.de
Date:   Fri Jan 16 22:42:33 2009 +0100

Documentation: let asciidoc align related options

Command line options can share the same paragraph of description, if
they are related or synonymous. In these cases they should be
written among each other, so that asciidoc can format them itself.

Signed-off-by: Markus Heidelberg markus.heidelb...@web.de
Signed-off-by: Junio C Hamano gits...@pobox.com
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 2/6] string_list: add two new functions for splitting strings

2012-09-10 Thread Michael Haggerty
Add two new functions, string_list_split() and
string_list_split_in_place().  These split a string into a string_list
on a separator character.  The first makes copies of the substrings
(leaving the input string untouched) and the second splits the
original string in place, overwriting the separator characters with
NULs and referring to the original string's memory.

These functions are similar to the strbuf_split_*() functions except
that they work with the more powerful string_list interface.

Signed-off-by: Michael Haggerty mhag...@alum.mit.edu
---
 .gitignore  |  1 +
 Documentation/technical/api-string-list.txt | 21 +-
 Makefile|  1 +
 string-list.c   | 49 ++
 string-list.h   | 29 +
 t/t0063-string-list.sh  | 63 +
 test-string-list.c  | 45 +
 7 files changed, 208 insertions(+), 1 deletion(-)
 create mode 100755 t/t0063-string-list.sh
 create mode 100644 test-string-list.c

diff --git a/.gitignore b/.gitignore
index bb5c91e..0ca7df8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -193,6 +193,7 @@
 /test-run-command
 /test-sha1
 /test-sigchain
+/test-string-list
 /test-subprocess
 /test-svn-fe
 /common-cmds.h
diff --git a/Documentation/technical/api-string-list.txt 
b/Documentation/technical/api-string-list.txt
index 113f841..670217c 100644
--- a/Documentation/technical/api-string-list.txt
+++ b/Documentation/technical/api-string-list.txt
@@ -21,7 +21,8 @@ member (you need this if you add things later) and you should 
set the
 `nr` and `alloc` members in that case, too.
 
 . Adds new items to the list, using `string_list_append`,
-  `string_list_append_nodup`, or `string_list_insert`.
+  `string_list_append_nodup`, `string_list_insert`,
+  `string_list_split`, and/or `string_list_split_in_place`.
 
 . Can check if a string is in the list using `string_list_has_string` or
   `unsorted_string_list_has_string` and get it from the list using
@@ -135,6 +136,24 @@ counterpart for sorted lists, which performs a binary 
search.
is set. The third parameter controls if the `util` pointer of the
items should be freed or not.
 
+`string_list_split`, `string_list_split_in_place`::
+
+   Split a string into substrings on a delimiter character and
+   append the substrings to a `string_list`.  If `maxsplit` is
+   non-negative, then split at most `maxsplit` times.  Return the
+   number of substrings appended to the list.
++
+`string_list_split` requires a `string_list` that has `strdup_strings`
+set to true; it leaves the input string untouched and makes copies of
+the substrings in newly-allocated memory.
+`string_list_split_in_place` requires a `string_list` that has
+`strdup_strings` set to false; it splits the input string in place,
+overwriting the delimiter characters with NULs and creating new
+string_list_items that point into the original string (the original
+string must therefore not be modified or freed while the `string_list`
+is in use).
+
+
 Data structures
 ---
 
diff --git a/Makefile b/Makefile
index 66e8216..ebbb381 100644
--- a/Makefile
+++ b/Makefile
@@ -501,6 +501,7 @@ TEST_PROGRAMS_NEED_X += test-run-command
 TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
 TEST_PROGRAMS_NEED_X += test-sha1
 TEST_PROGRAMS_NEED_X += test-sigchain
+TEST_PROGRAMS_NEED_X += test-string-list
 TEST_PROGRAMS_NEED_X += test-subprocess
 TEST_PROGRAMS_NEED_X += test-svn-fe
 
diff --git a/string-list.c b/string-list.c
index 5594b7d..f9051ec 100644
--- a/string-list.c
+++ b/string-list.c
@@ -204,3 +204,52 @@ void unsorted_string_list_delete_item(struct string_list 
*list, int i, int free_
list-items[i] = list-items[list-nr-1];
list-nr--;
 }
+
+int string_list_split(struct string_list *list, const char *string,
+ int delim, int maxsplit)
+{
+   int count = 0;
+   const char *p = string, *end;
+
+   assert(list-strdup_strings);
+   for (;;) {
+   count++;
+   if (maxsplit = 0  count  maxsplit) {
+   string_list_append(list, p);
+   return count;
+   }
+   end = strchr(p, delim);
+   if (end) {
+   string_list_append_nodup(list, xmemdupz(p, end - p));
+   p = end + 1;
+   } else {
+   string_list_append(list, p);
+   return count;
+   }
+   }
+}
+
+int string_list_split_in_place(struct string_list *list, char *string,
+  int delim, int maxsplit)
+{
+   int count = 0;
+   char *p = string, *end;
+
+   assert(!list-strdup_strings);
+   for (;;) {
+   count++;
+   if (maxsplit = 0  count  maxsplit) {
+   

Re: [PATCH v2 2/6] string_list: add two new functions for splitting strings

2012-09-10 Thread Junio C Hamano
Michael Haggerty mhag...@alum.mit.edu writes:

 diff --git a/string-list.c b/string-list.c
 index 5594b7d..f9051ec 100644
 --- a/string-list.c
 +++ b/string-list.c
 @@ -204,3 +204,52 @@ void unsorted_string_list_delete_item(struct string_list 
 *list, int i, int free_
   list-items[i] = list-items[list-nr-1];
   list-nr--;
  }
 +
 +int string_list_split(struct string_list *list, const char *string,
 +   int delim, int maxsplit)
 +{
 + int count = 0;
 + const char *p = string, *end;
 +
 + assert(list-strdup_strings);

This may be a taste thing, but I'd prefer to see assert() only for
verification of pre-condition by internal callers to catch stupid
programming errors.  For a library-ish function like sl_split() that
expects to be called from anybody outside the string-list API, a
violation of this pre-condition is a usage error of the API, and
should trigger a runtime error (even without NDEBUG), no?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/6] string_list: add two new functions for splitting strings

2012-09-10 Thread Junio C Hamano
Michael Haggerty mhag...@alum.mit.edu writes:

 +`string_list_split`, `string_list_split_in_place`::
 +
 + Split a string into substrings on a delimiter character and
 + append the substrings to a `string_list`.  If `maxsplit` is
 + non-negative, then split at most `maxsplit` times.  Return the
 + number of substrings appended to the list.


I recall that we favor

`A`::
`B`::

Description for A and B

for some reason but do not remember exactly why.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html