Index: doc/src/sgml/ref/psql-ref.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v retrieving revision 1.147 diff -c -c -r1.147 psql-ref.sgml *** doc/src/sgml/ref/psql-ref.sgml 14 Jul 2005 08:42:36 -0000 1.147 --- doc/src/sgml/ref/psql-ref.sgml 18 Jul 2005 19:38:56 -0000 *************** *** 1493,1499 **** ! numericsep Toggles the display of a locale-aware character to separate groups --- 1493,1499 ---- ! numericlocale Toggles the display of a locale-aware character to separate groups Index: src/bin/psql/command.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/command.c,v retrieving revision 1.149 diff -c -c -r1.149 command.c *** src/bin/psql/command.c 14 Jul 2005 08:42:37 -0000 1.149 --- src/bin/psql/command.c 18 Jul 2005 19:39:02 -0000 *************** *** 1420,1435 **** : _("Expanded display is off.\n")); } ! /* numeric separators */ ! else if (strcmp(param, "numericsep") == 0) { ! popt->topt.numericSep = !popt->topt.numericSep; if (!quiet) { ! if (popt->topt.numericSep) ! puts(_("Showing numeric separators.")); else ! puts(_("Numeric separators are off.")); } } --- 1420,1435 ---- : _("Expanded display is off.\n")); } ! /* locale-aware numeric output */ ! else if (strcmp(param, "numericlocale") == 0) { ! popt->topt.numericLocale = !popt->topt.numericLocale; if (!quiet) { ! if (popt->topt.numericLocale) ! puts(_("Showing locale-adjusted numeric output.")); else ! puts(_("Locale-adjusted numeric output is off.")); } } Index: src/bin/psql/help.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/help.c,v retrieving revision 1.104 diff -c -c -r1.104 help.c *** src/bin/psql/help.c 10 Jul 2005 03:46:13 -0000 1.104 --- src/bin/psql/help.c 18 Jul 2005 19:39:02 -0000 *************** *** 239,245 **** fprintf(output, _(" \\pset NAME [VALUE]\n" " set table output option\n" " (NAME := {format|border|expanded|fieldsep|footer|null|\n" ! " numericsep|recordsep|tuples_only|title|tableattr|pager})\n")); fprintf(output, _(" \\t show only rows (currently %s)\n"), ON(pset.popt.topt.tuples_only)); fprintf(output, _(" \\T [STRING] set HTML tag attributes, or unset if none\n")); --- 239,245 ---- fprintf(output, _(" \\pset NAME [VALUE]\n" " set table output option\n" " (NAME := {format|border|expanded|fieldsep|footer|null|\n" ! " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n")); fprintf(output, _(" \\t show only rows (currently %s)\n"), ON(pset.popt.topt.tuples_only)); fprintf(output, _(" \\T [STRING] set HTML
tag attributes, or unset if none\n")); Index: src/bin/psql/print.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/print.c,v retrieving revision 1.71 diff -c -c -r1.71 print.c *** src/bin/psql/print.c 18 Jul 2005 19:27:37 -0000 1.71 --- src/bin/psql/print.c 18 Jul 2005 19:39:03 -0000 *************** *** 62,69 **** return strlen(my_str) - frac_len; } static int ! len_numericseps(const char *my_str) { int int_len = integer_digits(my_str), len = 0; int groupdigits = atoi(grouping); --- 62,70 ---- return strlen(my_str) - frac_len; } + /* Return additional length required for locale-aware numeric output */ static int ! additional_numeric_locale_len(const char *my_str) { int int_len = integer_digits(my_str), len = 0; int groupdigits = atoi(grouping); *************** *** 80,92 **** } static int ! len_with_numericsep(const char *my_str) { ! return strlen(my_str) + len_numericseps(my_str); } static void ! format_numericsep(char *my_str) { int i, j, int_len = integer_digits(my_str), leading_digits; int groupdigits = atoi(grouping); --- 81,93 ---- } static int ! strlen_with_numeric_locale(const char *my_str) { ! return strlen(my_str) + additional_numeric_locale_len(my_str); } static void ! format_numeric_locale(char *my_str) { int i, j, int_len = integer_digits(my_str), leading_digits; int groupdigits = atoi(grouping); *************** *** 95,101 **** if (my_str[0] == '-') my_str++; ! new_str = pg_local_malloc(len_with_numericsep(my_str) + 1); leading_digits = (int_len % groupdigits != 0) ? int_len % groupdigits : groupdigits; --- 96,102 ---- if (my_str[0] == '-') my_str++; ! new_str = pg_local_malloc(strlen_with_numeric_locale(my_str) + 1); leading_digits = (int_len % groupdigits != 0) ? int_len % groupdigits : groupdigits; *************** *** 143,149 **** const char *const *cells, const char *const *footers, const char *opt_align, const char *opt_fieldsep, const char *opt_recordsep, bool opt_tuples_only, ! bool opt_numericsep, FILE *fout) { unsigned int col_count = 0; unsigned int i; --- 144,150 ---- const char *const *cells, const char *const *footers, const char *opt_align, const char *opt_fieldsep, const char *opt_recordsep, bool opt_tuples_only, ! bool opt_numeric_locale, FILE *fout) { unsigned int col_count = 0; unsigned int i; *************** *** 182,193 **** fputs(opt_recordsep, fout); need_recordsep = false; } ! if (opt_align[i % col_count] == 'r' && opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); fputs(my_cell, fout); free(my_cell); } --- 183,194 ---- fputs(opt_recordsep, fout); need_recordsep = false; } ! if (opt_align[i % col_count] == 'r' && opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); fputs(my_cell, fout); free(my_cell); } *************** *** 227,233 **** const char *const *cells, const char *const *footers, const char *opt_align, const char *opt_fieldsep, const char *opt_recordsep, ! bool opt_tuples_only, bool opt_numericsep, FILE *fout) { unsigned int col_count = 0; unsigned int i; --- 228,234 ---- const char *const *cells, const char *const *footers, const char *opt_align, const char *opt_fieldsep, const char *opt_recordsep, ! bool opt_tuples_only, bool opt_numeric_locale, FILE *fout) { unsigned int col_count = 0; unsigned int i; *************** *** 258,269 **** fputs(headers[i % col_count], fout); fputs(opt_fieldsep, fout); ! if (opt_align[i % col_count] == 'r' && opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); fputs(my_cell, fout); free(my_cell); } --- 259,270 ---- fputs(headers[i % col_count], fout); fputs(opt_fieldsep, fout); ! if (opt_align[i % col_count] == 'r' && opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); fputs(my_cell, fout); free(my_cell); } *************** *** 331,337 **** static void print_aligned_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, ! const char *opt_align, bool opt_tuples_only, bool opt_numericsep, unsigned short int opt_border, int encoding, FILE *fout) { --- 332,338 ---- static void print_aligned_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, ! const char *opt_align, bool opt_tuples_only, bool opt_numeric_locale, unsigned short int opt_border, int encoding, FILE *fout) { *************** *** 398,411 **** for (i = 0, ptr = cells; *ptr; ptr++, i++) { ! int numericseps; ! if (opt_align[i % col_count] == 'r' && opt_numericsep) ! numericseps = len_numericseps(*ptr); else ! numericseps = 0; ! tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding) + numericseps; if (tmp > widths[i % col_count]) widths[i % col_count] = tmp; cell_w[i] = tmp; --- 399,412 ---- for (i = 0, ptr = cells; *ptr; ptr++, i++) { ! int numeric_locale_len; ! if (opt_align[i % col_count] == 'r' && opt_numeric_locale) ! numeric_locale_len = additional_numeric_locale_len(*ptr); else ! numeric_locale_len = 0; ! tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding) + numeric_locale_len; if (tmp > widths[i % col_count]) widths[i % col_count] = tmp; cell_w[i] = tmp; *************** *** 485,496 **** /* content */ if (opt_align[i % col_count] == 'r') { ! if (opt_numericsep) { char *my_cell = pg_local_malloc(cell_w[i] + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); fprintf(fout, "%*s%s", widths[i % col_count] - cell_w[i], "", my_cell); free(my_cell); } --- 486,497 ---- /* content */ if (opt_align[i % col_count] == 'r') { ! if (opt_numeric_locale) { char *my_cell = pg_local_malloc(cell_w[i] + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); fprintf(fout, "%*s%s", widths[i % col_count] - cell_w[i], "", my_cell); free(my_cell); } *************** *** 552,558 **** print_aligned_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, int encoding, FILE *fout) { unsigned int col_count = 0; --- 553,559 ---- print_aligned_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, int encoding, FILE *fout) { unsigned int col_count = 0; *************** *** 615,628 **** /* find longest data cell */ for (i = 0, ptr = cells; *ptr; ptr++, i++) { ! int numericseps; ! if (opt_align[i % col_count] == 'r' && opt_numericsep) ! numericseps = len_numericseps(*ptr); else ! numericseps = 0; ! tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding) + numericseps; if (tmp > dwidth) dwidth = tmp; cell_w[i] = tmp; --- 616,629 ---- /* find longest data cell */ for (i = 0, ptr = cells; *ptr; ptr++, i++) { ! int numeric_locale_len; ! if (opt_align[i % col_count] == 'r' && opt_numeric_locale) ! numeric_locale_len = additional_numeric_locale_len(*ptr); else ! numeric_locale_len = 0; ! tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding) + numeric_locale_len; if (tmp > dwidth) dwidth = tmp; cell_w[i] = tmp; *************** *** 700,707 **** char *my_cell = pg_local_malloc(cell_w[i] + 1); strcpy(my_cell, *ptr); ! if (opt_align[i % col_count] == 'r' && opt_numericsep) ! format_numericsep(my_cell); if (opt_border < 2) puts(my_cell); else --- 701,708 ---- char *my_cell = pg_local_malloc(cell_w[i] + 1); strcpy(my_cell, *ptr); ! if (opt_align[i % col_count] == 'r' && opt_numeric_locale) ! format_numeric_locale(my_cell); if (opt_border < 2) puts(my_cell); else *************** *** 788,794 **** print_html_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, const char *opt_table_attr, FILE *fout) { unsigned int col_count = 0; --- 789,795 ---- print_html_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, const char *opt_table_attr, FILE *fout) { unsigned int col_count = 0; *************** *** 834,845 **** /* is string only whitespace? */ if ((*ptr)[strspn(*ptr, " \t")] == '\0') fputs("  ", fout); ! else if (opt_align[i % col_count] == 'r' && opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); html_escaped_print(my_cell, fout); free(my_cell); } --- 835,846 ---- /* is string only whitespace? */ if ((*ptr)[strspn(*ptr, " \t")] == '\0') fputs("  ", fout); ! else if (opt_align[i % col_count] == 'r' && opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); html_escaped_print(my_cell, fout); free(my_cell); } *************** *** 875,881 **** print_html_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, const char *opt_table_attr, FILE *fout) { unsigned int col_count = 0; --- 876,882 ---- print_html_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, const char *opt_table_attr, FILE *fout) { unsigned int col_count = 0; *************** *** 919,930 **** /* is string only whitespace? */ if ((*ptr)[strspn(*ptr, " \t")] == '\0') fputs("  ", fout); ! else if (opt_align[i % col_count] == 'r' && opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); html_escaped_print(my_cell, fout); free(my_cell); } --- 920,931 ---- /* is string only whitespace? */ if ((*ptr)[strspn(*ptr, " \t")] == '\0') fputs("  ", fout); ! else if (opt_align[i % col_count] == 'r' && opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); html_escaped_print(my_cell, fout); free(my_cell); } *************** *** 1000,1006 **** print_latex_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; --- 1001,1007 ---- print_latex_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; *************** *** 1061,1072 **** /* print cells */ for (i = 0, ptr = cells; *ptr; i++, ptr++) { ! if (opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); latex_escaped_print(my_cell, fout); free(my_cell); } --- 1062,1073 ---- /* print cells */ for (i = 0, ptr = cells; *ptr; i++, ptr++) { ! if (opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); latex_escaped_print(my_cell, fout); free(my_cell); } *************** *** 1103,1109 **** print_latex_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; --- 1104,1110 ---- print_latex_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; *************** *** 1174,1185 **** if (footers && !opt_tuples_only) for (ptr = footers; *ptr; ptr++) { ! if (opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); latex_escaped_print(my_cell, fout); free(my_cell); } --- 1175,1186 ---- if (footers && !opt_tuples_only) for (ptr = footers; *ptr; ptr++) { ! if (opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); latex_escaped_print(my_cell, fout); free(my_cell); } *************** *** 1220,1226 **** print_troff_ms_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; --- 1221,1227 ---- print_troff_ms_text(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; *************** *** 1274,1285 **** /* print cells */ for (i = 0, ptr = cells; *ptr; i++, ptr++) { ! if (opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); troff_ms_escaped_print(my_cell, fout); free(my_cell); } --- 1275,1286 ---- /* print cells */ for (i = 0, ptr = cells; *ptr; i++, ptr++) { ! if (opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); troff_ms_escaped_print(my_cell, fout); free(my_cell); } *************** *** 1313,1319 **** print_troff_ms_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numericsep, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; --- 1314,1320 ---- print_troff_ms_vertical(const char *title, const char *const *headers, const char *const *cells, const char *const *footers, const char *opt_align, bool opt_tuples_only, ! bool opt_numeric_locale, unsigned short int opt_border, FILE *fout) { unsigned int col_count = 0; *************** *** 1386,1397 **** troff_ms_escaped_print(headers[i % col_count], fout); fputc('\t', fout); ! if (opt_numericsep) { ! char *my_cell = pg_local_malloc(len_with_numericsep(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numericsep(my_cell); troff_ms_escaped_print(my_cell, fout); free(my_cell); } --- 1387,1398 ---- troff_ms_escaped_print(headers[i % col_count], fout); fputc('\t', fout); ! if (opt_numeric_locale) { ! char *my_cell = pg_local_malloc(strlen_with_numeric_locale(*ptr) + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); troff_ms_escaped_print(my_cell, fout); free(my_cell); } *************** *** 1533,1539 **** /* print the stuff */ if (flog) ! print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, opt->numericSep, border, opt->encoding, flog); switch (opt->format) { --- 1534,1540 ---- /* print the stuff */ if (flog) ! print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, opt->numericLocale, border, opt->encoding, flog); switch (opt->format) { *************** *** 1541,1590 **** if (use_expanded) print_unaligned_vertical(title, headers, cells, footers, align, opt->fieldSep, opt->recordSep, ! opt->tuples_only, opt->numericSep, output); else print_unaligned_text(title, headers, cells, footers, align, opt->fieldSep, opt->recordSep, ! opt->tuples_only, opt->numericSep, output); break; case PRINT_ALIGNED: if (use_expanded) print_aligned_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, opt->encoding, output); else print_aligned_text(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, opt->encoding, output); break; case PRINT_HTML: if (use_expanded) print_html_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, opt->tableAttr, output); else print_html_text(title, headers, cells, footers, ! align, opt->tuples_only, opt->numericSep, border, opt->tableAttr, output); break; case PRINT_LATEX: if (use_expanded) print_latex_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, output); else print_latex_text(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, output); break; case PRINT_TROFF_MS: if (use_expanded) print_troff_ms_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, output); else print_troff_ms_text(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericSep, border, output); break; default: --- 1542,1591 ---- if (use_expanded) print_unaligned_vertical(title, headers, cells, footers, align, opt->fieldSep, opt->recordSep, ! opt->tuples_only, opt->numericLocale, output); else print_unaligned_text(title, headers, cells, footers, align, opt->fieldSep, opt->recordSep, ! opt->tuples_only, opt->numericLocale, output); break; case PRINT_ALIGNED: if (use_expanded) print_aligned_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, opt->encoding, output); else print_aligned_text(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, opt->encoding, output); break; case PRINT_HTML: if (use_expanded) print_html_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, opt->tableAttr, output); else print_html_text(title, headers, cells, footers, ! align, opt->tuples_only, opt->numericLocale, border, opt->tableAttr, output); break; case PRINT_LATEX: if (use_expanded) print_latex_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, output); else print_latex_text(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, output); break; case PRINT_TROFF_MS: if (use_expanded) print_troff_ms_vertical(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, output); else print_troff_ms_text(title, headers, cells, footers, align, ! opt->tuples_only, opt->numericLocale, border, output); break; default: Index: src/bin/psql/print.h =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/print.h,v retrieving revision 1.27 diff -c -c -r1.27 print.h *** src/bin/psql/print.h 14 Jul 2005 08:42:37 -0000 1.27 --- src/bin/psql/print.h 18 Jul 2005 19:39:03 -0000 *************** *** 40,46 **** char *fieldSep; /* field separator for unaligned text mode */ char *recordSep; /* record separator for unaligned text * mode */ ! bool numericSep; /* locale-aware numeric units separator and * decimal marker */ char *tableAttr; /* attributes for HTML
*/ int encoding; /* character encoding */ --- 40,46 ---- char *fieldSep; /* field separator for unaligned text mode */ char *recordSep; /* record separator for unaligned text * mode */ ! bool numericLocale; /* locale-aware numeric units separator and * decimal marker */ char *tableAttr; /* attributes for HTML
*/ int encoding; /* character encoding */