NeoMutt  2020-11-20
Teaching an old dog new tricks
DOXYGEN
mbtable.h File Reference

Type representing a multibyte character table. More...

+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  MbTable
 multibyte character table More...
 

Functions

void mbtable_free (struct MbTable **table)
 Free an MbTable object. More...
 
struct MbTablembtable_parse (const char *str)
 Parse a multibyte string into a table. More...
 

Detailed Description

Type representing a multibyte character table.

Authors
  • Richard Russon

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file mbtable.h.

Function Documentation

◆ mbtable_free()

void mbtable_free ( struct MbTable **  table)

Free an MbTable object.

Parameters
[out]tableMbTable to free

Definition at line 281 of file mbtable.c.

282 {
283  if (!table || !*table)
284  return;
285 
286  FREE(&(*table)->orig_str);
287  FREE(&(*table)->chars);
288  FREE(&(*table)->segmented_str);
289  FREE(table);
290 }
#define FREE(x)
Definition: memory.h:40
+ Here is the caller graph for this function:

◆ mbtable_parse()

struct MbTable* mbtable_parse ( const char *  s)

Parse a multibyte string into a table.

Parameters
sString of multibyte characters
Return values
ptrNew MbTable object

Definition at line 49 of file mbtable.c.

50 {
51  struct MbTable *t = NULL;
52  size_t slen, k;
53  mbstate_t mbstate;
54  char *d = NULL;
55 
56  slen = mutt_str_len(s);
57  if (!slen)
58  return NULL;
59 
60  t = mutt_mem_calloc(1, sizeof(struct MbTable));
61 
62  t->orig_str = mutt_str_dup(s);
63  /* This could be more space efficient. However, being used on tiny
64  * strings (`$to_chars` and `$status_chars`), the overhead is not great. */
65  t->chars = mutt_mem_calloc(slen, sizeof(char *));
66  t->segmented_str = mutt_mem_calloc(slen * 2, sizeof(char));
67  d = t->segmented_str;
68 
69  memset(&mbstate, 0, sizeof(mbstate));
70  while (slen && (k = mbrtowc(NULL, s, slen, &mbstate)))
71  {
72  if ((k == (size_t)(-1)) || (k == (size_t)(-2)))
73  {
74  /* XXX put message in err buffer; fail? warning? */
75  mutt_debug(LL_DEBUG1, "mbrtowc returned %d converting %s in %s\n",
76  (k == (size_t)(-1)) ? -1 : -2, s, t->orig_str);
77  if (k == (size_t)(-1))
78  memset(&mbstate, 0, sizeof(mbstate));
79  k = (k == (size_t)(-1)) ? 1 : slen;
80  }
81 
82  slen -= k;
83  t->chars[t->len++] = d;
84  while (k--)
85  *d++ = *s++;
86  *d++ = '\0';
87  }
88 
89  return t;
90 }
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
char ** chars
The array of multibyte character strings.
Definition: mbtable.h:39
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:370
multibyte character table
Definition: mbtable.h:35
char * orig_str
Original string used to generate this object.
Definition: mbtable.h:37
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:631
Log at debug level 1.
Definition: logging.h:40
#define mutt_debug(LEVEL,...)
Definition: logging.h:81
int len
Number of characters.
Definition: mbtable.h:38
char * segmented_str
Each chars entry points inside this string.
Definition: mbtable.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function: