po: Use "rsync" instead of "wget" for po-update target.
[pspp] / src / libpspp / str.c
index cde0db9ae091a6493f8f8cb2238f9fec0c308b0e..5aa7e41594e9ab989ac7a77dcafe6d8802e49fa8 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -189,7 +189,7 @@ buf_copy_rpad (char *dst, size_t dst_size,
 void
 str_copy_rpad (char *dst, size_t dst_size, const char *src)
 {
-  if (dst_size > 0) 
+  if (dst_size > 0)
     {
       size_t src_len = strlen (src);
       if (src_len < dst_size - 1)
@@ -257,9 +257,10 @@ str_lowercase (char *s)
 }
 
 /* Converts NUMBER into a string in 26-adic notation in BUFFER,
-   which has room for SIZE bytes.  Returns true if successful,
-   false if NUMBER, plus a trailing null, is too large to fit in
-   the available space.
+   which has room for SIZE bytes.  Uses uppercase if UPPERCASE is
+   true, otherwise lowercase, Returns true if successful, false
+   if NUMBER, plus a trailing null, is too large to fit in the
+   available space.
 
    26-adic notation is "spreadsheet column numbering": 1 = A, 2 =
    B, 3 = C, ... 26 = Z, 27 = AA, 28 = AB, 29 = AC, ...
@@ -271,15 +272,18 @@ str_lowercase (char *s)
    For more information, see
    http://en.wikipedia.org/wiki/Bijective_numeration. */
 bool
-str_format_26adic (unsigned long int number, char buffer[], size_t size)
+str_format_26adic (unsigned long int number, bool uppercase,
+                   char buffer[], size_t size)
 {
+  const char *alphabet
+    = uppercase ? "ABCDEFGHIJKLMNOPQRSTUVWXYZ" : "abcdefghijklmnopqrstuvwxyz";
   size_t length = 0;
 
   while (number-- > 0)
     {
       if (length >= size)
         goto overflow;
-      buffer[length++] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[number % 26];
+      buffer[length++] = alphabet[number % 26];
       number /= 26;
     }
 
@@ -1519,7 +1523,7 @@ ds_put_c_format (struct string *st, const char *format, ...)
 }
 
 
-/* Formats FORMAT as a printf string, using fmt_func (a snprintf like function) 
+/* Formats FORMAT as a printf string, using fmt_func (a snprintf like function)
    and appends the result to ST. */
 static void
 ds_put_vformat_int (struct string *st, const char *format, va_list args_,
@@ -1571,7 +1575,7 @@ ds_put_vformat (struct string *st, const char *format, va_list args_)
   ds_put_vformat_int (st, format, args_, vsnprintf);
 }
 
-/* Formats FORMAT as a printf string, as if in the C locale, 
+/* Formats FORMAT as a printf string, as if in the C locale,
    and appends the result to ST. */
 void
 ds_put_c_vformat (struct string *st, const char *format, va_list args_)
@@ -1593,6 +1597,13 @@ ds_put_byte_multiple (struct string *st, int ch, size_t cnt)
   memset (ds_put_uninit (st, cnt), ch, cnt);
 }
 
+/* Appends Unicode code point UC to ST in UTF-8 encoding. */
+void
+ds_put_unichar (struct string *st, ucs4_t uc)
+{
+  ds_extend (st, ds_length (st) + 6);
+  st->ss.length += u8_uctomb (CHAR_CAST (uint8_t *, ds_end (st)), uc, 6);
+}
 
 /* If relocation has been enabled, replace ST,
    with its relocated version */