diff options
| author | ckelsel <ckelsel@hotmail.com> | 2017-07-10 08:10:15 +0800 | 
|---|---|---|
| committer | ckelsel <ckelsel@hotmail.com> | 2017-07-10 08:10:15 +0800 | 
| commit | 465bbee520d1b1b57477fd7d80fbdeaf5e1e1e77 (patch) | |
| tree | edae38568202ba41dee4a49f78884da313fd114b /src/nvim/message.c | |
| parent | 1514cdc7d8863eeee6b04883b1c50aac40048b49 (diff) | |
| parent | 6725667d31591e8025589c4c1df34469f3bfdb52 (diff) | |
| download | rneovim-465bbee520d1b1b57477fd7d80fbdeaf5e1e1e77.tar.gz rneovim-465bbee520d1b1b57477fd7d80fbdeaf5e1e1e77.tar.bz2 rneovim-465bbee520d1b1b57477fd7d80fbdeaf5e1e1e77.zip  | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/nvim/message.c')
| -rw-r--r-- | src/nvim/message.c | 161 | 
1 files changed, 89 insertions, 72 deletions
diff --git a/src/nvim/message.c b/src/nvim/message.c index 057ce75f79..36f9ca84ed 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -1196,7 +1196,7 @@ int msg_outtrans_len_attr(char_u *msgstr, int len, int attr)        len -= mb_l - 1;        str += mb_l;      } else { -      s = transchar_byte(*str); +      s = transchar_byte((uint8_t)(*str));        if (s[1] != NUL) {          // Unprintable char: print the printable chars so far and the          // translation of the unprintable char. @@ -1269,7 +1269,7 @@ msg_outtrans_special (        string = "<Space>";        str++;      } else { -      string = (const char *)str2special((char_u **)&str, from); +      string = str2special((const char **)&str, from, false);      }      const int len = vim_strsize((char_u *)string);      // Highlight special keys @@ -1281,108 +1281,125 @@ msg_outtrans_special (    return retval;  } -/* - * Return the lhs or rhs of a mapping, with the key codes turned into printable - * strings, in an allocated string. - */ -char_u * -str2special_save ( -    char_u *str, -    int is_lhs          /* TRUE for lhs, FALSE for rhs */ -) +/// Convert string, replacing key codes with printables +/// +/// Used for lhs or rhs of mappings. +/// +/// @param[in]  str  String to convert. +/// @param[in]  replace_spaces  Convert spaces into `<Space>`, normally used fo +///                             lhs, but not rhs. +/// @param[in]  replace_lt  Convert `<` into `<lt>`. +/// +/// @return [allocated] Converted string. +char *str2special_save(const char *const str, const bool replace_spaces, +                       const bool replace_lt) +  FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC +  FUNC_ATTR_NONNULL_RET  {    garray_T ga; -  char_u      *p = str; -    ga_init(&ga, 1, 40); -  while (*p != NUL) -    ga_concat(&ga, str2special(&p, is_lhs)); + +  const char *p = str; +  while (*p != NUL) { +    ga_concat(&ga, (const char_u *)str2special(&p, replace_spaces, replace_lt)); +  }    ga_append(&ga, NUL); -  return (char_u *)ga.ga_data; +  return (char *)ga.ga_data;  } -/* - * Return the printable string for the key codes at "*sp". - * Used for translating the lhs or rhs of a mapping to printable chars. - * Advances "sp" to the next code. - */ -char_u * -str2special ( -    char_u **sp, -    int from               /* TRUE for lhs of mapping */ -) -{ -  int c; -  static char_u buf[7]; -  char_u              *str = *sp; -  int modifiers = 0; -  int special = FALSE; - -  if (has_mbyte) { -    char_u  *p; - -    /* Try to un-escape a multi-byte character.  Return the un-escaped -     * string if it is a multi-byte character. */ -    p = mb_unescape(sp); -    if (p != NULL) -      return p; +/// Convert character, replacing key one key code with printable representation +/// +/// @param[in,out]  sp  String to convert. Is advanced to the next key code. +/// @param[in]  replace_spaces  Convert spaces into <Space>, normally used for +///                             lhs, but not rhs. +/// @param[in]  replace_lt  Convert `<` into `<lt>`. +/// +/// @return Converted key code, in a static buffer. Buffer is always one and the +///         same, so save converted string somewhere before running str2special +///         for the second time. +const char *str2special(const char **const sp, const bool replace_spaces, +                        const bool replace_lt) +  FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET +{ +  static char buf[7]; + +  // Try to un-escape a multi-byte character.  Return the un-escaped +  // string if it is a multi-byte character. +  const char *const p = mb_unescape(sp); +  if (p != NULL) { +    return p;    } -  c = *str; +  const char *str = *sp; +  int c = (uint8_t)(*str); +  int modifiers = 0; +  bool special = false;    if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) { -    if (str[1] == KS_MODIFIER) { -      modifiers = str[2]; +    if ((uint8_t)str[1] == KS_MODIFIER) { +      modifiers = (uint8_t)str[2];        str += 3; -      c = *str; +      c = (uint8_t)(*str);      }      if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) { -      c = TO_SPECIAL(str[1], str[2]); +      c = TO_SPECIAL((uint8_t)str[1], (uint8_t)str[2]);        str += 2; -      if (c == KS_ZERO)         /* display <Nul> as ^@ or <Nul> */ +      if (c == KS_ZERO) {  // display <Nul> as ^@ or <Nul>          c = NUL; +      } +    } +    if (IS_SPECIAL(c) || modifiers) {  // Special key. +      special = true;      } -    if (IS_SPECIAL(c) || modifiers)     /* special key */ -      special = TRUE;    } -  if (has_mbyte && !IS_SPECIAL(c)) { -    int len = (*mb_ptr2len)(str); +  if (!IS_SPECIAL(c)) { +    const int len = utf_ptr2len((const char_u *)str); -    /* For multi-byte characters check for an illegal byte. */ -    if (has_mbyte && MB_BYTE2LEN(*str) > len) { -      transchar_nonprint(buf, c); +    // Check for an illegal byte. +    if (MB_BYTE2LEN((uint8_t)(*str)) > len) { +      transchar_nonprint((char_u *)buf, c);        *sp = str + 1;        return buf;      } -    /* Since 'special' is TRUE the multi-byte character 'c' will be -     * processed by get_special_key_name() */ -    c = (*mb_ptr2char)(str); +    // Since 'special' is TRUE the multi-byte character 'c' will be +    // processed by get_special_key_name(). +    c = utf_ptr2char((const char_u *)str);      *sp = str + len; -  } else +  } else {      *sp = str + 1; +  } -  /* Make unprintable characters in <> form, also <M-Space> and <Tab>. -   * Use <Space> only for lhs of a mapping. */ -  if (special || char2cells(c) > 1 || (from && c == ' ')) -    return get_special_key_name(c, modifiers); +  // Make unprintable characters in <> form, also <M-Space> and <Tab>. +  if (special +      || char2cells(c) > 1 +      || (replace_spaces && c == ' ') +      || (replace_lt && c == '<')) { +    return (const char *)get_special_key_name(c, modifiers); +  }    buf[0] = c;    buf[1] = NUL;    return buf;  } -/* - * Translate a key sequence into special key names. - */ -void str2specialbuf(char_u *sp, char_u *buf, int len) +/// Convert string, replacing key codes with printables +/// +/// @param[in]  str  String to convert. +/// @param[out]  buf  Buffer to save results to. +/// @param[in]  len  Buffer length. +void str2specialbuf(const char *sp, char *buf, size_t len) +  FUNC_ATTR_NONNULL_ALL  { -  char_u      *s; - -  *buf = NUL;    while (*sp) { -    s = str2special(&sp, FALSE); -    if ((int)(STRLEN(s) + STRLEN(buf)) < len) -      STRCAT(buf, s); +    const char *s = str2special(&sp, false, false); +    const size_t s_len = strlen(s); +    if (s_len <= len) { +      break; +    } +    memcpy(buf, s, s_len); +    buf += s_len; +    len -= s_len;    } +  *buf = NUL;  }  /*  | 
