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:1233
int PQdsplen(const char *s, int encoding)
Definition: fe-misc.c:1253
int i
Definition: isn.c:72
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:241
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().