str: Add function xstrdup_if_nonnull() and introduce many users.
[pspp] / src / language / lexer / lexer.c
index 9c402e679a949837720ce3f2589b0306b44b05cb..ceeb153c3e596804a924ea90fffd6a474ff0db66 100644 (file)
@@ -141,7 +141,7 @@ void
 lex_reader_set_file_name (struct lex_reader *reader, const char *file_name)
 {
   free (reader->file_name);
-  reader->file_name = file_name != NULL ? xstrdup (file_name) : NULL;
+  reader->file_name = xstrdup_if_nonnull (file_name);
 }
 \f
 /* Creates and returns a new lexer. */
@@ -1231,7 +1231,10 @@ lex_ellipsize__ (struct substring in, char *out, size_t out_size)
   int mblen;
 
   assert (out_size >= 16);
-  out_maxlen = out_size - (in.length >= out_size ? 3 : 0) - 1;
+  out_maxlen = out_size - 1;
+  if (in.length > out_maxlen - 3)
+    out_maxlen -= 3;
+
   for (out_len = 0; out_len < in.length; out_len += mblen)
     {
       if (in.string[out_len] == '\n'
@@ -1243,6 +1246,10 @@ lex_ellipsize__ (struct substring in, char *out, size_t out_size)
 
       mblen = u8_mblen (CHAR_CAST (const uint8_t *, in.string + out_len),
                         in.length - out_len);
+
+      if (mblen < 0)
+        break;
+
       if (out_len + mblen > out_maxlen)
         break;
     }
@@ -1437,7 +1444,8 @@ lex_source_get__ (const struct lex_source *src_)
 
       /* Submit the line as syntax. */
       text_item_submit (text_item_create_nocopy (TEXT_ITEM_SYNTAX,
-                                                 xmemdup0 (line, copy_len)));
+                                                 xmemdup0 (line, copy_len),
+                                                 NULL));
 
       src->journal_pos += line_len;
     }
@@ -1602,7 +1610,7 @@ lex_reader_for_file (const char *file_name, const char *encoding,
   r->reader.syntax = syntax;
   r->reader.error = error;
   r->reader.file_name = xstrdup (file_name);
-  r->reader.encoding = encoding ? xstrdup (encoding) : NULL;
+  r->reader.encoding = xstrdup_if_nonnull (encoding);
   r->reader.line_number = 1;
   r->istream = istream;
 
@@ -1671,7 +1679,7 @@ lex_reader_for_substring_nocopy (struct substring s, const char *encoding)
   r = xmalloc (sizeof *r);
   lex_reader_init (&r->reader, &lex_string_reader_class);
   r->reader.syntax = LEX_SYNTAX_AUTO;
-  r->reader.encoding = encoding ? xstrdup (encoding) : NULL;
+  r->reader.encoding = xstrdup_if_nonnull (encoding);
   r->s = s;
   r->offset = 0;