Changeset 619 for trunk


Ignore:
Timestamp:
Nov 24, 2015, 10:27:02 AM (4 years ago)
Author:
cito
Message:

Fixed a problem on NetBSD

It seems isdigit() and ispunct() expect unsigned chars instead of
ints on certain platforms, and silencing them by casting signed
chars to ints was counter productive, causing serious issues on
NetBSD and maybe other platforms. To avoid problems with the
implementation of isdigit() and ispunct() on different platforms
and with different locales, we totally avoid these functions now
and check the chars "manually" instead, which is an easy thing.

Location:
trunk/module
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/module/TEST_PyGreSQL_classic_connection.py

    r617 r619  
    11511151        self.assertIsInstance(r, str)
    11521152        self.assertEqual(r, ',')
     1153        pg.set_decimal_point("'")
     1154        try:
     1155            r = pg.get_decimal_point()
     1156        finally:
     1157            pg.set_decimal_point(point)
     1158        self.assertIsInstance(r, str)
     1159        self.assertEqual(r, "'")
     1160        pg.set_decimal_point('')
     1161        try:
     1162            r = pg.get_decimal_point()
     1163        finally:
     1164            pg.set_decimal_point(point)
     1165        self.assertIsNone(r)
     1166        pg.set_decimal_point(None)
     1167        try:
     1168            r = pg.get_decimal_point()
     1169        finally:
     1170            pg.set_decimal_point(point)
     1171        self.assertIsNone(r)
    11531172
    11541173    def testSetDecimalPoint(self):
     
    11991218        self.assertIn(r, en_money)
    12001219        r = query(select_money)
     1220        pg.set_decimal_point('')
     1221        try:
     1222            r = r.getresult()[0][0]
     1223        finally:
     1224            pg.set_decimal_point(point)
     1225        self.assertIsInstance(r, str)
     1226        self.assertIn(r, en_money)
     1227        r = query(select_money)
    12011228        pg.set_decimal_point('.')
    12021229        try:
     
    12151242        self.assertEqual(r, bad_money)
    12161243        r = query(select_money)
    1217         pg.set_decimal_point('!')
     1244        pg.set_decimal_point("'")
    12181245        try:
    12191246            r = r.getresult()[0][0]
     
    12451272        self.assertIn(r, de_money)
    12461273        r = query(select_money)
     1274        pg.set_decimal_point('')
     1275        try:
     1276            r = r.getresult()[0][0]
     1277        finally:
     1278            pg.set_decimal_point(point)
     1279        self.assertIsInstance(r, str)
     1280        self.assertIn(r, de_money)
     1281        r = query(select_money)
    12471282        pg.set_decimal_point(',')
    12481283        try:
     
    12601295        self.assertEqual(r, bad_money)
    12611296        r = query(select_money)
    1262         pg.set_decimal_point('!')
     1297        pg.set_decimal_point("'")
    12631298        try:
    12641299            r = r.getresult()[0][0]
  • trunk/module/pgmodule.c

    r618 r619  
    32903290                                                         s++)
    32913291                                                {
    3292                                                         if (isdigit((int)*s))
     3292                                                        if (*s >= '0' && *s <= '9')
    32933293                                                                cashbuf[k++] = *s;
    32943294                                                        else if (*s == decimal_point)
     
    32973297                                                                cashbuf[k++] = '-';
    32983298                                                }
    3299                                                 cashbuf[k] = 0;
     3299                                                cashbuf[k] = '\0';
    33003300                                                s = cashbuf;
    33013301
     
    34433443                                                         s++)
    34443444                                                {
    3445                                                         if (isdigit((int)*s))
     3445                                                        if (*s >= '0' && *s <= '9')
    34463446                                                                cashbuf[k++] = *s;
    34473447                                                        else if (*s == decimal_point)
     
    34503450                                                                cashbuf[k++] = '-';
    34513451                                                }
    3452                                                 cashbuf[k] = 0;
     3452                                                cashbuf[k] = '\0';
    34533453                                                s = cashbuf;
    34543454
     
    38033803                if (!s)
    38043804                        s = "\0";
    3805                 else if (*s && (*(s+1) || !ispunct((int)*s)))
     3805                else if (*s && (*(s+1) || !strchr(".,;: '*/_`|", *s)))
    38063806                        s = NULL;
    38073807        }
     
    38123812        } else {
    38133813                PyErr_SetString(PyExc_TypeError,
    3814                         "set_decimal_point() takes a punctuation character");
     3814                        "set_decimal_point() expects a decimal mark character");
    38153815        }
    38163816
Note: See TracChangeset for help on using the changeset viewer.