X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fstr.c;h=44e4a1da28ee7183a98eb1e819a755bc55759c0f;hb=811c669032a18cfff53291a98e5803afdf39db36;hp=c630cf9ada761aa89b260197ca0718b1e9ff4344;hpb=14b360304396965ef0ed26f639e5b07e2766d23e;p=pspp diff --git a/src/libpspp/str.c b/src/libpspp/str.c index c630cf9ada..44e4a1da28 100644 --- a/src/libpspp/str.c +++ b/src/libpspp/str.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012 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 @@ -270,17 +270,22 @@ str_format_26adic (unsigned long int number, char buffer[], size_t size) while (number-- > 0) { if (length >= size) - return false; + goto overflow; buffer[length++] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[number % 26]; number /= 26; } if (length >= size) - return false; + goto overflow; buffer[length] = '\0'; buf_reverse (buffer, length); return true; + +overflow: + if (length > 0) + buffer[0] = '\0'; + return false; } /* Sets the SIZE bytes starting at BLOCK to C, @@ -486,11 +491,15 @@ bool ss_tokenize (struct substring ss, struct substring delimiters, size_t *save_idx, struct substring *token) { + bool found_token; + ss_advance (&ss, *save_idx); *save_idx += ss_ltrim (&ss, delimiters); ss_get_bytes (&ss, ss_cspan (ss, delimiters), token); - *save_idx += ss_length (*token) + 1; - return ss_length (*token) > 0; + + found_token = ss_length (*token) > 0; + *save_idx += ss_length (*token) + found_token; + return found_token; } /* Removes the first CNT bytes from SS. */ @@ -1539,6 +1548,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 */