format: Make fmt_check() easier to translate.
[pspp] / src / data / identifier.c
index 6191f0db9028257e7facbddc566c5ba2e0ef08cb..07c7675bd5a3000cf3742c85505bf68b2174ebd3 100644 (file)
 #include "data/identifier.h"
 
 #include <string.h>
+#include <unistr.h>
 #include <unictype.h>
 
 #include "libpspp/assertion.h"
+#include "libpspp/cast.h"
 
 #include "gl/c-ctype.h"
 
@@ -44,7 +46,6 @@ token_type_to_name (enum token_type type)
 #define TOKEN_TYPE(TYPE) case T_##TYPE: return #TYPE;
       TOKEN_TYPES
 #undef TOKEN_TYPE
-    case TOKEN_N_TYPES:
     default:
       return "unknown token type";
     }
@@ -63,6 +64,8 @@ token_type_to_string (enum token_type token)
     case T_POS_NUM:
     case T_NEG_NUM:
     case T_STRING:
+    case T_MACRO_ID:
+    case T_MACRO_PUNCT:
     case T_STOP:
       return NULL;
 
@@ -140,9 +143,6 @@ token_type_to_string (enum token_type token)
 
     case T_EXP:
       return "**";
-
-    case TOKEN_N_TYPES:
-      NOT_REACHED ();
     }
 
   NOT_REACHED ();
@@ -232,15 +232,21 @@ lex_uc_is_space (ucs4_t uc)
 size_t
 lex_id_get_length (struct substring string)
 {
-  size_t length = 0;
-  if (!ss_is_empty (string) && lex_is_id1 (ss_first (string)))
+  const uint8_t *s = CHAR_CAST (const uint8_t *, string.string);
+  size_t len = string.length;
+  size_t ofs;
+  int mblen;
+
+  for (ofs = 0; ofs < string.length; ofs += mblen)
     {
-      length = 1;
-      while (length < ss_length (string)
-             && lex_is_idn (ss_at (string, length)))
-        length++;
+      ucs4_t uc;
+
+      mblen = u8_mbtouc (&uc, s + ofs, len - ofs);
+      if (!(ofs == 0 ? lex_uc_is_id1 (uc) : lex_uc_is_idn (uc)))
+        break;
     }
-  return length;
+
+  return ofs;
 }
 \f
 /* Comparing identifiers. */