|
3 | 3 | *
|
4 | 4 | * Copyright (c) 2000-2005, PostgreSQL Global Development Group
|
5 | 5 | *
|
6 |
| - * $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.68 2005/07/1415:54:21 momjian Exp $ |
| 6 | + * $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.69 2005/07/1421:12:41 momjian Exp $ |
7 | 7 | */
|
8 | 8 | #include"postgres_fe.h"
|
9 | 9 | #include"common.h"
|
@@ -50,76 +50,79 @@ pg_local_malloc(size_t size)
|
50 | 50 | }
|
51 | 51 |
|
52 | 52 | staticint
|
53 |
| -num_numericseps(constchar*my_str) |
| 53 | +integer_digits(constchar*my_str) |
54 | 54 | {
|
55 |
| -intold_len,dec_len,int_len; |
56 |
| -intgroupdigits=atoi(grouping); |
| 55 | +intfrac_len; |
57 | 56 |
|
58 | 57 | if (my_str[0]=='-')
|
59 | 58 | my_str++;
|
60 | 59 |
|
61 |
| -old_len=strlen(my_str); |
62 |
| -dec_len=strchr(my_str,'.') ?strlen(strchr(my_str,'.')) :0; |
| 60 | +frac_len=strchr(my_str,'.') ?strlen(strchr(my_str,'.')) :0; |
| 61 | + |
| 62 | +returnstrlen(my_str)-frac_len; |
| 63 | +} |
| 64 | + |
| 65 | +staticint |
| 66 | +len_numericseps(constchar*my_str) |
| 67 | +{ |
| 68 | +intint_len=integer_digits(my_str),sep_len; |
| 69 | +intgroupdigits=atoi(grouping); |
63 | 70 |
|
64 |
| -int_len=old_len-dec_len; |
65 | 71 | if (int_len %groupdigits!=0)
|
66 |
| -returnint_len /groupdigits; |
| 72 | +sep_len=int_len /groupdigits; |
67 | 73 | else
|
68 |
| -returnint_len /groupdigits-1;/* no leading separator */ |
| 74 | +sep_len=int_len /groupdigits-1;/* no leading separator */ |
| 75 | + |
| 76 | +returnsep_len*strlen(thousands_sep)- |
| 77 | +strlen(".")+strlen(decimal_point); |
69 | 78 | }
|
70 | 79 |
|
71 | 80 | staticint
|
72 | 81 | len_with_numericsep(constchar*my_str)
|
73 | 82 | {
|
74 |
| -returnstrlen(my_str)+num_numericseps(my_str); |
| 83 | +returnstrlen(my_str)+len_numericseps(my_str); |
75 | 84 | }
|
76 | 85 |
|
77 | 86 | staticvoid
|
78 | 87 | format_numericsep(char*my_str)
|
79 | 88 | {
|
80 |
| -inti,j,digits_before_sep,old_len,new_len,dec_len,int_len; |
81 |
| -char*new_str; |
82 |
| -char*dec_value; |
| 89 | +inti,j,int_len=integer_digits(my_str),leading_digits; |
83 | 90 | intgroupdigits=atoi(grouping);
|
| 91 | +char*new_str; |
84 | 92 |
|
85 | 93 | if (my_str[0]=='-')
|
86 | 94 | my_str++;
|
87 |
| - |
88 |
| -old_len=strlen(my_str); |
89 |
| -dec_len=strchr(my_str,'.') ?strlen(strchr(my_str,'.')) :0; |
90 |
| -int_len=old_len-dec_len; |
91 |
| -digits_before_sep=int_len %groupdigits; |
92 |
| - |
93 |
| -new_len=int_len+int_len /groupdigits+dec_len; |
94 |
| -if (digits_before_sep==0) |
95 |
| -new_len--;/* no leading separator */ |
| 95 | + |
| 96 | +new_str=pg_local_malloc(len_numericseps(my_str)+1); |
96 | 97 |
|
97 |
| -new_str=pg_local_malloc(new_len+1); |
| 98 | +leading_digits= (int_len %groupdigits!=0) ? |
| 99 | +int_len %groupdigits :groupdigits; |
98 | 100 |
|
99 | 101 | for (i=0,j=0; ;i++,j++)
|
100 | 102 | {
|
101 |
| -/*hit decimal point */ |
| 103 | +/*Hit decimal point? */ |
102 | 104 | if (my_str[i]=='.')
|
103 | 105 | {
|
104 |
| -new_str[j]=*decimal_point; |
105 |
| -new_str[j+1]='\0'; |
106 |
| -dec_value=strchr(my_str,'.'); |
107 |
| -strcat(new_str,++dec_value); |
| 106 | +strcpy(&new_str[j],decimal_point); |
| 107 | +j+=strlen(decimal_point); |
| 108 | +/* add fractional part */ |
| 109 | +strcpy(&new_str[j],&my_str[i]+1); |
108 | 110 | break;
|
109 | 111 | }
|
110 | 112 |
|
111 |
| -/*end of string */ |
| 113 | +/*End of string? */ |
112 | 114 | if (my_str[i]=='\0')
|
113 | 115 | {
|
114 | 116 | new_str[j]='\0';
|
115 | 117 | break;
|
116 | 118 | }
|
117 | 119 |
|
118 |
| -/* add separator? */ |
119 |
| -if (i!=0&& |
120 |
| -(i- (digits_before_sep ?digits_before_sep :groupdigits)) |
121 |
| -%groupdigits==0) |
122 |
| -new_str[j++]=*thousands_sep; |
| 120 | +/* Add separator? */ |
| 121 | +if (i!=0&& (i-leading_digits) %groupdigits==0) |
| 122 | +{ |
| 123 | +strcpy(&new_str[j],thousands_sep); |
| 124 | +j+=strlen(thousands_sep); |
| 125 | +} |
123 | 126 |
|
124 | 127 | new_str[j]=my_str[i];
|
125 | 128 | }
|
@@ -396,7 +399,7 @@ print_aligned_text(const char *title, const char *const *headers,
|
396 | 399 | intnumericseps;
|
397 | 400 |
|
398 | 401 | if (opt_align[i %col_count]=='r'&&opt_numericsep)
|
399 |
| -numericseps=num_numericseps(*ptr); |
| 402 | +numericseps=len_numericseps(*ptr); |
400 | 403 | else
|
401 | 404 | numericseps=0;
|
402 | 405 |
|
@@ -613,7 +616,7 @@ print_aligned_vertical(const char *title, const char *const *headers,
|
613 | 616 | intnumericseps;
|
614 | 617 |
|
615 | 618 | if (opt_align[i %col_count]=='r'&&opt_numericsep)
|
616 |
| -numericseps=num_numericseps(*ptr); |
| 619 | +numericseps=len_numericseps(*ptr); |
617 | 620 | else
|
618 | 621 | numericseps=0;
|
619 | 622 |
|
@@ -1711,7 +1714,6 @@ setDecimalLocale(void)
|
1711 | 1714 |
|
1712 | 1715 | extlconv=localeconv();
|
1713 | 1716 |
|
1714 |
| -/* These are treated as single-byte strings in the code */ |
1715 | 1717 | if (*extlconv->decimal_point)
|
1716 | 1718 | decimal_point=strdup(extlconv->decimal_point);
|
1717 | 1719 | else
|
|