util: New function for forming English lists.
authorBen Pfaff <blp@nicira.com>
Thu, 2 Jun 2011 17:47:18 +0000 (10:47 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 6 Jun 2011 15:58:02 +0000 (08:58 -0700)
This follows the rules I learned in school.  Some locales may prefer to
omit the comma before "and" in a list of three or more items.

lib/util.c
lib/util.h

index c05c582fed6fe2e0b4481aa01cfeb1a05e1f23a4..1a42376e21216fc0c3a07ea928dd172719f1515e 100644 (file)
@@ -596,3 +596,14 @@ abs_file_name(const char *dir, const char *file_name)
  * its return value.  (Note that every scalar type can be implicitly
  * converted to bool.) */
 void ignore(bool x OVS_UNUSED) { }
+
+/* Returns an appropriate delimiter for inserting just before the 0-based item
+ * 'index' in a list that has 'total' items in it. */
+const char *
+english_list_delimiter(size_t index, size_t total)
+{
+    return (index == 0 ? ""
+            : index < total - 1 ? ", "
+            : total > 2 ? ", and "
+            : " and ");
+}
index 2be7a70999f54d8abc73b00108e08c5e6dfab18c..7615288d8043eb51e80b54d8da582ebbeddc40b3 100644 (file)
@@ -186,6 +186,8 @@ bool str_to_double(const char *, double *);
 int hexit_value(int c);
 unsigned int hexits_value(const char *s, size_t n, bool *ok);
 
+const char *english_list_delimiter(size_t index, size_t total);
+
 char *get_cwd(void);
 char *dir_name(const char *file_name);
 char *base_name(const char *file_name);