PostgreSQL Source Code  git master
mbprint.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  lineptr
 

Functions

unsigned char * mbvalidate (unsigned char *pwcs, int encoding)
 
int pg_wcswidth (const char *pwcs, size_t len, int encoding)
 
void pg_wcsformat (const unsigned char *pwcs, size_t len, int encoding, struct lineptr *lines, int count)
 
void pg_wcssize (const unsigned char *pwcs, size_t len, int encoding, int *result_width, int *result_height, int *result_format_size)
 

Function Documentation

◆ mbvalidate()

unsigned char* mbvalidate ( unsigned char *  pwcs,
int  encoding 
)

Definition at line 392 of file mbprint.c.

393 {
394  if (encoding == PG_UTF8)
395  mb_utf_validate(pwcs);
396  else
397  {
398  /*
399  * other encodings needing validation should add their own routines
400  * here
401  */
402  }
403 
404  return pwcs;
405 }
#define PG_UTF8
Definition: mbprint.c:43
static void mb_utf_validate(unsigned char *pwcs)
Definition: mbprint.c:136
int32 encoding
Definition: pg_database.h:41

References encoding, mb_utf_validate(), and PG_UTF8.

Referenced by printTableAddCell(), and printTableAddHeader().

◆ pg_wcsformat()

void pg_wcsformat ( const unsigned char *  pwcs,
size_t  len,
int  encoding,
struct lineptr lines,
int  count 
)

Definition at line 294 of file mbprint.c.

296 {
297  int w,
298  chlen = 0;
299  int linewidth = 0;
300  unsigned char *ptr = lines->ptr; /* Pointer to data area */
301 
302  for (; *pwcs && len > 0; pwcs += chlen)
303  {
304  chlen = PQmblen((const char *) pwcs, encoding);
305  if (len < (size_t) chlen)
306  break;
307  w = PQdsplen((const char *) pwcs, encoding);
308 
309  if (chlen == 1) /* single-byte char */
310  {
311  if (*pwcs == '\n') /* Newline */
312  {
313  *ptr++ = '\0';
314  lines->width = linewidth;
315  linewidth = 0;
316  lines++;
317  count--;
318  if (count <= 0)
319  exit(1); /* Screwup */
320 
321  /* make next line point to remaining memory */
322  lines->ptr = ptr;
323  }
324  else if (*pwcs == '\r') /* Linefeed */
325  {
326  strcpy((char *) ptr, "\\r");
327  linewidth += 2;
328  ptr += 2;
329  }
330  else if (*pwcs == '\t') /* Tab */
331  {
332  do
333  {
334  *ptr++ = ' ';
335  linewidth++;
336  } while (linewidth % 8 != 0);
337  }
338  else if (w < 0) /* Other control char */
339  {
340  sprintf((char *) ptr, "\\x%02X", *pwcs);
341  linewidth += 4;
342  ptr += 4;
343  }
344  else /* Output it as-is */
345  {
346  linewidth += w;
347  *ptr++ = *pwcs;
348  }
349  }
350  else if (w < 0) /* Non-ascii control char */
351  {
352  if (encoding == PG_UTF8)
353  sprintf((char *) ptr, "\\u%04X", utf8_to_unicode(pwcs));
354  else
355  {
356  /*
357  * This case cannot happen in the current code because only
358  * UTF-8 signals multibyte control characters. But we may need
359  * to support it at some stage
360  */
361  sprintf((char *) ptr, "\\u????");
362  }
363  ptr += 6;
364  linewidth += 6;
365  }
366  else /* All other chars */
367  {
368  int i;
369 
370  for (i = 0; i < chlen; i++)
371  *ptr++ = pwcs[i];
372  linewidth += w;
373  }
374  len -= chlen;
375  }
376  lines->width = linewidth;
377  *ptr++ = '\0'; /* Terminate formatted string */
378 
379  if (count <= 0)
380  exit(1); /* Screwup */
381 
382  (lines + 1)->ptr = NULL; /* terminate line array */
383 }
int PQmblen(const char *s, int encoding)
Definition: fe-misc.c:1177
int PQdsplen(const char *s, int encoding)
Definition: fe-misc.c:1197
int i
Definition: isn.c:73
exit(1)
static pg_wchar utf8_to_unicode(const unsigned char *c)
Definition: mbprint.c:53
const void size_t len
#define sprintf
Definition: port.h:240
int width
Definition: mbprint.h:19
unsigned char * ptr
Definition: mbprint.h:18

References encoding, exit(), i, len, PG_UTF8, PQdsplen(), PQmblen(), lineptr::ptr, sprintf, utf8_to_unicode(), and lineptr::width.

Referenced by print_aligned_text(), and print_aligned_vertical().

◆ pg_wcssize()

void pg_wcssize ( const unsigned char *  pwcs,
size_t  len,
int  encoding,
int *  result_width,
int *  result_height,
int *  result_format_size 
)

Definition at line 211 of file mbprint.c.

213 {
214  int w,
215  chlen = 0,
216  linewidth = 0;
217  int width = 0;
218  int height = 1;
219  int format_size = 0;
220 
221  for (; *pwcs && len > 0; pwcs += chlen)
222  {
223  chlen = PQmblen((const char *) pwcs, encoding);
224  if (len < (size_t) chlen)
225  break;
226  w = PQdsplen((const char *) pwcs, encoding);
227 
228  if (chlen == 1) /* single-byte char */
229  {
230  if (*pwcs == '\n') /* Newline */
231  {
232  if (linewidth > width)
233  width = linewidth;
234  linewidth = 0;
235  height += 1;
236  format_size += 1; /* For NUL char */
237  }
238  else if (*pwcs == '\r') /* Linefeed */
239  {
240  linewidth += 2;
241  format_size += 2;
242  }
243  else if (*pwcs == '\t') /* Tab */
244  {
245  do
246  {
247  linewidth++;
248  format_size++;
249  } while (linewidth % 8 != 0);
250  }
251  else if (w < 0) /* Other control char */
252  {
253  linewidth += 4;
254  format_size += 4;
255  }
256  else /* Output it as-is */
257  {
258  linewidth += w;
259  format_size += 1;
260  }
261  }
262  else if (w < 0) /* Non-ascii control char */
263  {
264  linewidth += 6; /* \u0000 */
265  format_size += 6;
266  }
267  else /* All other chars */
268  {
269  linewidth += w;
270  format_size += chlen;
271  }
272  len -= chlen;
273  }
274  if (linewidth > width)
275  width = linewidth;
276  format_size += 1; /* For NUL char */
277 
278  /* Set results */
279  if (result_width)
280  *result_width = width;
281  if (result_height)
282  *result_height = height;
283  if (result_format_size)
284  *result_format_size = format_size;
285 }

References encoding, len, PQdsplen(), and PQmblen().

Referenced by print_aligned_text(), and print_aligned_vertical().

◆ pg_wcswidth()

int pg_wcswidth ( const char *  pwcs,
size_t  len,
int  encoding 
)

Definition at line 177 of file mbprint.c.

178 {
179  int width = 0;
180 
181  while (len > 0)
182  {
183  int chlen,
184  chwidth;
185 
186  chlen = PQmblen(pwcs, encoding);
187  if (len < (size_t) chlen)
188  break; /* Invalid string */
189 
190  chwidth = PQdsplen(pwcs, encoding);
191  if (chwidth > 0)
192  width += chwidth;
193 
194  pwcs += chlen;
195  len -= chlen;
196  }
197  return width;
198 }

References encoding, len, PQdsplen(), and PQmblen().

Referenced by describeOneTableDetails().