X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fidentifier.c;h=db20010464cab1e3f3a1f42cc1e7a4c012bf8c1b;hb=00aad3b983774328140a04436d7d6ae7925fec97;hp=6191f0db9028257e7facbddc566c5ba2e0ef08cb;hpb=ca93ab32faadf34ab43dd5de464dbd137895e82b;p=pspp diff --git a/src/data/identifier.c b/src/data/identifier.c index 6191f0db90..db20010464 100644 --- a/src/data/identifier.c +++ b/src/data/identifier.c @@ -24,9 +24,11 @@ #include "data/identifier.h" #include +#include #include #include "libpspp/assertion.h" +#include "libpspp/cast.h" #include "gl/c-ctype.h" @@ -232,15 +234,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; } /* Comparing identifiers. */