OSDN Git Service

Adjust to_char/from_char code to use boolean "is_to_char" rather than
authorBruce Momjian <bruce@momjian.us>
Wed, 17 Aug 2005 21:47:55 +0000 (21:47 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 17 Aug 2005 21:47:55 +0000 (21:47 +0000)
integer with flags.

src/backend/utils/adt/formatting.c

index 6c1a877..5633731 100644 (file)
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------
  * formatting.c
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.94 2005/07/27 12:44:09 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.95 2005/08/17 21:47:55 momjian Exp $
  *
  *
  *      Portions Copyright (c) 1999-2005, PostgreSQL Global Development Group
@@ -136,7 +136,7 @@ typedef struct
        const char *name;                       /* keyword                      */
        int                     len;                    /* keyword length               */
        int (*action) (int arg, char *inout,    /* action for keyword */
-                                  int suf, int flag,
+                                  int suf, bool is_to_char,
                                   FormatNode *node, void *data);
        int                     id;                             /* keyword id                   */
        bool            isitdigit;              /* is expected output/input digit */
@@ -231,9 +231,6 @@ static char *numth[] = {"st", "nd", "rd", "th", NULL};
  * Flags & Options:
  * ----------
  */
-#define TO_CHAR                1
-#define FROM_CHAR      2
-
 #define ONE_UPPER      1                       /* Name */
 #define ALL_UPPER      2                       /* NAME */
 #define ALL_LOWER      3                       /* name */
@@ -250,11 +247,7 @@ static char *numth[] = {"st", "nd", "rd", "th", NULL};
  * Flags for DCH version
  * ----------
  */
-static int     DCH_global_flag = 0;
-
-#define DCH_F_FX       0x01
-
-#define IS_FX          (DCH_global_flag & DCH_F_FX)
+static bool    DCH_global_fx = false;
 
 
 /* ----------
@@ -440,9 +433,9 @@ typedef struct TmToChar
  *                     KeyWords definition & action
  *****************************************************************************/
 
-static int     dch_global(int arg, char *inout, int suf, int flag, FormatNode *node, void *data);
-static int     dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data);
-static int     dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data);
+static int     dch_global(int arg, char *inout, int suf, bool is_to_char, FormatNode *node, void *data);
+static int     dch_time(int arg, char *inout, int suf, bool is_to_char, FormatNode *node, void *data);
+static int     dch_date(int arg, char *inout, int suf, bool is_to_char, FormatNode *node, void *data);
 
 /* ----------
  * Suffixes:
@@ -843,8 +836,7 @@ static const int    NUM_index[KeyWord_INDEX_SIZE] = {
  */
 typedef struct NUMProc
 {
-       int                     type;                   /* FROM_CHAR (TO_NUMBER) or TO_CHAR */
-
+       bool            is_to_char;
        NUMDesc    *Num;                        /* number description           */
 
        int                     sign,                   /* '-' or '+'                   */
@@ -883,7 +875,7 @@ static KeySuffix *suff_search(char *str, KeySuffix *suf, int type);
 static void NUMDesc_prepare(NUMDesc *num, FormatNode *n);
 static void parse_format(FormatNode *node, char *str, const KeyWord *kw,
                         KeySuffix *suf, const int *index, int ver, NUMDesc *Num);
-static char *DCH_processor(FormatNode *node, char *inout, int flag, void *data);
+static char *DCH_processor(FormatNode *node, char *inout, bool is_to_char, void *data);
 
 #ifdef DEBUG_TO_FROM_CHAR
 static void dump_index(const KeyWord *k, const int *index);
@@ -908,7 +900,7 @@ static char *get_last_relevant_decnum(char *num);
 static void NUM_numpart_from_char(NUMProc *Np, int id, int plen);
 static void NUM_numpart_to_char(NUMProc *Np, int id);
 static char *NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
-                         int plen, int sign, int type);
+                         int plen, int sign, bool is_to_char);
 static DCHCacheEntry *DCH_cache_search(char *str);
 static DCHCacheEntry *DCH_cache_getnew(char *str);
 
@@ -1298,7 +1290,7 @@ parse_format(FormatNode *node, char *str, const KeyWord *kw,
  * ----------
  */
 static char *
-DCH_processor(FormatNode *node, char *inout, int flag, void *data)
+DCH_processor(FormatNode *node, char *inout, bool is_to_char, void *data)
 {
        FormatNode *n;
        char       *s;
@@ -1307,11 +1299,11 @@ DCH_processor(FormatNode *node, char *inout, int flag, void *data)
        /*
         * Zeroing global flags
         */
-       DCH_global_flag = 0;
+       DCH_global_fx = false;
 
        for (n = node, s = inout; n->type != NODE_TYPE_END; n++)
        {
-               if (flag == FROM_CHAR && *s == '\0')
+               if (!is_to_char && *s == '\0')
 
                        /*
                         * The input string is shorter than format picture, so it's
@@ -1329,7 +1321,7 @@ DCH_processor(FormatNode *node, char *inout, int flag, void *data)
                        /*
                         * Call node action function
                         */
-                       len = n->key->action(n->key->id, s, n->suffix, flag, n, data);
+                       len = n->key->action(n->key->id, s, n->suffix, is_to_char, n, data);
                        if (len > 0)
                                s += len;
                        else if (len == -1)
@@ -1341,26 +1333,22 @@ DCH_processor(FormatNode *node, char *inout, int flag, void *data)
                        /*
                         * Remove to output char from input in TO_CHAR
                         */
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                                *s = n->character;
-
                        else
                        {
                                /*
                                 * Skip blank space in FROM_CHAR's input
                                 */
-                               if (isspace((unsigned char) n->character) && IS_FX == 0)
-                               {
+                               if (isspace((unsigned char) n->character) && !DCH_global_fx)
                                        while (*s != '\0' && isspace((unsigned char) *(s + 1)))
                                                ++s;
-                               }
                        }
                }
-
-               ++s;                                    /* ! */
+               ++s;
        }
 
-       if (flag == TO_CHAR)
+       if (is_to_char)
                *s = '\0';
        return inout;
 }
@@ -1630,10 +1618,10 @@ dump_index(const KeyWord *k, const int *index)
  * ----------
  */
 static int
-dch_global(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
+dch_global(int arg, char *inout, int suf, bool is_to_char, FormatNode *node, void *data)
 {
        if (arg == DCH_FX)
-               DCH_global_flag |= DCH_F_FX;
+               DCH_global_fx = true;
        return -1;
 }
 
@@ -1696,14 +1684,14 @@ strdigits_len(char *str)
  * ----------
  */
 static int
-dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
+dch_time(int arg, char *inout, int suf, bool is_to_char, FormatNode *node, void *data)
 {
        char       *p_inout = inout;
        struct pg_tm *tm = NULL;
        TmFromChar *tmfc = NULL;
        TmToChar   *tmtc = NULL;
 
-       if (flag == TO_CHAR)
+       if (is_to_char)
        {
                tmtc = (TmToChar *) data;
                tm = tmtcTm(tmtc);
@@ -1715,13 +1703,13 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
        {
                case DCH_A_M:
                case DCH_P_M:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, ((tm->tm_hour > 11
                                                          && tm->tm_hour < HOURS_PER_DAY) ? P_M_STR : A_M_STR));
                                return 3;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, P_M_STR, 4) == 0)
                                        tmfc->pm = TRUE;
@@ -1734,13 +1722,13 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_AM:
                case DCH_PM:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, ((tm->tm_hour > 11
                                                                && tm->tm_hour < HOURS_PER_DAY) ? PM_STR : AM_STR));
                                return 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, PM_STR, 2) == 0)
                                        tmfc->pm = TRUE;
@@ -1753,13 +1741,13 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_a_m:
                case DCH_p_m:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, ((tm->tm_hour > 11
                                                          && tm->tm_hour < HOURS_PER_DAY) ? p_m_STR : a_m_STR));
                                return 3;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, p_m_STR, 4) == 0)
                                        tmfc->pm = TRUE;
@@ -1772,13 +1760,13 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_am:
                case DCH_pm:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, ((tm->tm_hour > 11
                                                                && tm->tm_hour < HOURS_PER_DAY) ? pm_STR : am_STR));
                                return 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, pm_STR, 2) == 0)
                                        tmfc->pm = TRUE;
@@ -1791,7 +1779,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_HH:
                case DCH_HH12:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2,
                                                tm->tm_hour == 0 ? 12 :
@@ -1804,7 +1792,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -1819,7 +1807,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_HH24:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_hour);
                                if (S_THth(suf))
@@ -1830,7 +1818,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -1845,7 +1833,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_MI:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_min);
                                if (S_THth(suf))
@@ -1856,7 +1844,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -1871,7 +1859,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_SS:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_sec);
                                if (S_THth(suf))
@@ -1882,7 +1870,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -1897,7 +1885,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_MS:                    /* millisecond */
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
 #ifdef HAVE_INT64_TIMESTAMP
                                sprintf(inout, "%03d", (int) (tmtc->fsec / INT64CONST(1000)));
@@ -1912,7 +1900,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 2;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                int                     len,
                                                        x;
@@ -1944,7 +1932,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_US:                    /* microsecond */
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
 #ifdef HAVE_INT64_TIMESTAMP
                                sprintf(inout, "%06d", (int) tmtc->fsec);
@@ -1958,7 +1946,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                else
                                        return 5;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                int                     len,
                                                        x;
@@ -1989,7 +1977,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_SSSS:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%d", tm->tm_hour * SECS_PER_HOUR +
                                                tm->tm_min * SECS_PER_MINUTE +
@@ -1998,7 +1986,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        str_numth(p_inout, inout, S_TH_TYPE(suf));
                                return strlen(p_inout) - 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2014,7 +2002,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_tz:
                case DCH_TZ:
-                       if (flag == TO_CHAR && tmtcTzn(tmtc))
+                       if (is_to_char && tmtcTzn(tmtc))
                        {
                                int                     siz = strlen(tmtcTzn(tmtc));
 
@@ -2030,7 +2018,7 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                }
                                return siz - 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else if (!is_to_char)
                                ereport(ERROR,
                                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                                 errmsg("\"TZ\"/\"tz\" not supported")));
@@ -2055,7 +2043,7 @@ do { \
  * ----------
  */
 static int
-dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
+dch_date(int arg, char *inout, int suf, bool is_to_char, FormatNode *node, void *data)
 {
        char            buff[DCH_CACHE_SIZE],
                                workbuff[32],
@@ -2066,7 +2054,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
        TmFromChar *tmfc = NULL;
        TmToChar   *tmtc = NULL;
 
-       if (flag == TO_CHAR)
+       if (is_to_char)
        {
                tmtc = (TmToChar *) data;
                tm = tmtcTm(tmtc);
@@ -2081,7 +2069,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
         * or "january", all is before search convert to "first-upper". This
         * convention is used for MONTH, MON, DAY, DY
         */
-       if (flag == FROM_CHAR)
+       if (!is_to_char)
        {
                if (arg == DCH_MONTH || arg == DCH_Month || arg == DCH_month)
                {
@@ -2121,13 +2109,13 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
        {
                case DCH_A_D:
                case DCH_B_C:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, (tm->tm_year <= 0 ? B_C_STR : A_D_STR));
                                return 3;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, B_C_STR, 4) == 0)
                                        tmfc->bc = TRUE;
@@ -2136,13 +2124,13 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_AD:
                case DCH_BC:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, (tm->tm_year <= 0 ? BC_STR : AD_STR));
                                return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, BC_STR, 2) == 0)
                                        tmfc->bc = TRUE;
@@ -2151,13 +2139,13 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_a_d:
                case DCH_b_c:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, (tm->tm_year <= 0 ? b_c_STR : a_d_STR));
                                return 3;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, b_c_STR, 4) == 0)
                                        tmfc->bc = TRUE;
@@ -2166,13 +2154,13 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_ad:
                case DCH_bc:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                strcpy(inout, (tm->tm_year <= 0 ? bc_STR : ad_STR));
                                return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (strncmp(inout, bc_STR, 2) == 0)
                                        tmfc->bc = TRUE;
@@ -2229,7 +2217,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        return 2;
 
                case DCH_MM:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_mon);
                                if (S_THth(suf))
@@ -2239,7 +2227,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                else
                                        return 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2291,7 +2279,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        return 2;
 
                case DCH_DDD:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 3, tm->tm_yday);
                                if (S_THth(suf))
@@ -2302,7 +2290,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 2;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2317,7 +2305,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_DD:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_mday);
                                if (S_THth(suf))
@@ -2328,7 +2316,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2343,7 +2331,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_D:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%d", tm->tm_wday + 1);
                                if (S_THth(suf))
@@ -2353,14 +2341,14 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                }
                                return 0;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%1d", &tmfc->d);
                                return 0 + SKIP_THth(suf);
                        }
                        break;
                case DCH_WW:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2,
                                                (tm->tm_yday - 1) / 7 + 1);
@@ -2372,7 +2360,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2387,7 +2375,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_IW:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2,
                                         date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday));
@@ -2398,7 +2386,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                else
                                        return 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2413,7 +2401,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_Q:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                if (!tm->tm_mon)
                                        return -1;
@@ -2425,14 +2413,14 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                }
                                return 0;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%1d", &tmfc->q);
                                return 0 + SKIP_THth(suf);
                        }
                        break;
                case DCH_CC:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                i = tm->tm_year / 100 + 1;
                                if (i <= 99 && i >= -99)
@@ -2444,7 +2432,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                return strlen(p_inout) - 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2459,7 +2447,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_Y_YYY:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                i = YEAR_ABS(tm->tm_year) / 1000;
                                sprintf(inout, "%d,%03d", i, YEAR_ABS(tm->tm_year) - (i * 1000));
@@ -2467,7 +2455,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        str_numth(p_inout, inout, S_TH_TYPE(suf));
                                return strlen(p_inout) - 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                int                     cc;
 
@@ -2479,7 +2467,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_YYYY:
                case DCH_IYYY:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                if (tm->tm_year <= 9999 && tm->tm_year >= -9998)
                                        sprintf(inout, "%0*d",
@@ -2502,7 +2490,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        str_numth(p_inout, inout, S_TH_TYPE(suf));
                                return strlen(p_inout) - 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                if (S_FM(suf) || is_next_separator(node))
                                {
@@ -2520,7 +2508,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_YYY:
                case DCH_IYY:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                snprintf(buff, sizeof(buff), "%03d",
                                                 arg == DCH_YYY ?
@@ -2537,7 +2525,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                return 2;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%03d", &tmfc->year);
 
@@ -2555,7 +2543,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_YY:
                case DCH_IY:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                snprintf(buff, sizeof(buff), "%02d",
                                                 arg == DCH_YY ?
@@ -2572,7 +2560,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                return 1;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%02d", &tmfc->year);
 
@@ -2590,7 +2578,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        break;
                case DCH_Y:
                case DCH_I:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                snprintf(buff, sizeof(buff), "%1d",
                                                 arg == DCH_Y ?
@@ -2607,7 +2595,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                return 0;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%1d", &tmfc->year);
 
@@ -2620,7 +2608,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_RM:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                if (!tm->tm_mon)
                                        return -1;
@@ -2632,7 +2620,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 3;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                tmfc->mm = 12 - seq_search(inout, rm_months_upper, ALL_UPPER, FULL_SIZ, &len);
                                CHECK_SEQ_SEARCH(len, "RM");
@@ -2643,7 +2631,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_rm:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                if (!tm->tm_mon)
                                        return -1;
@@ -2655,7 +2643,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                        return 3;
 
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                tmfc->mm = 12 - seq_search(inout, rm_months_lower, ALL_LOWER, FULL_SIZ, &len);
                                CHECK_SEQ_SEARCH(len, "rm");
@@ -2666,7 +2654,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                        }
                        break;
                case DCH_W:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%d", (tm->tm_mday - 1) / 7 + 1);
                                if (S_THth(suf))
@@ -2676,21 +2664,21 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
                                }
                                return 0;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%1d", &tmfc->w);
                                return 0 + SKIP_THth(suf);
                        }
                        break;
                case DCH_J:
-                       if (flag == TO_CHAR)
+                       if (is_to_char)
                        {
                                sprintf(inout, "%d", date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
                                if (S_THth(suf))
                                        str_numth(p_inout, inout, S_TH_TYPE(suf));
                                return strlen(p_inout) - 1;
                        }
-                       else if (flag == FROM_CHAR)
+                       else
                        {
                                sscanf(inout, "%d", &tmfc->j);
                                return strdigits_len(inout) - 1 + SKIP_THth(suf);
@@ -2857,7 +2845,7 @@ datetime_to_char_body(TmToChar *tmtc, text *fmt)
                format = ent->format;
        }
 
-       DCH_processor(format, result, TO_CHAR, (void *) tmtc);
+       DCH_processor(format, result, true, (void *) tmtc);
 
        if (!incache)
                pfree(format);
@@ -3111,7 +3099,7 @@ do_to_timestamp(text *date_txt, text *fmt,
                memcpy(date_str, VARDATA(date_txt), date_len);
                *(date_str + date_len) = '\0';
 
-               DCH_processor(format, date_str, FROM_CHAR, (void *) &tmfc);
+               DCH_processor(format, date_str, false, (void *) &tmfc);
 
                pfree(date_str);
                pfree(fmt_str);
@@ -4081,7 +4069,7 @@ NUM_numpart_to_char(NUMProc *Np, int id)
  */
 static char *
 NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
-                         int plen, int sign, int type)
+                         int plen, int sign, bool is_to_char)
 {
        FormatNode *n;
        NUMProc         _Np,
@@ -4090,7 +4078,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
        MemSet(Np, 0, sizeof(NUMProc));
 
        Np->Num = Num;
-       Np->type = type;
+       Np->is_to_char = is_to_char;
        Np->number = number;
        Np->inout = inout;
        Np->last_relevant = NULL;
@@ -4106,7 +4094,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
         */
        if (IS_ROMAN(Np->Num))
        {
-               if (Np->type == FROM_CHAR)
+               if (!Np->is_to_char)
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                         errmsg("\"RN\" not supported")));
@@ -4127,9 +4115,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
        /*
         * Sign
         */
-       if (type == FROM_CHAR)
-               Np->sign = FALSE;
-       else
+       if (is_to_char)
        {
                Np->sign = sign;
 
@@ -4162,13 +4148,15 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                Np->Num->lsign = NUM_LSIGN_POST;
                }
        }
+       else
+               Np->sign = FALSE;
 
        /*
         * Count
         */
        Np->num_count = Np->Num->post + Np->Num->pre - 1;
 
-       if (type == TO_CHAR)
+       if (is_to_char)
        {
                Np->num_pre = plen;
 
@@ -4224,15 +4212,14 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
        /*
         * Processor direct cycle
         */
-       if (Np->type == FROM_CHAR)
-               Np->number_p = Np->number + 1;  /* first char is space for sign */
-       else if (Np->type == TO_CHAR)
+       if (Np->is_to_char)
                Np->number_p = Np->number;
+       else
+               Np->number_p = Np->number + 1;  /* first char is space for sign */
 
        for (n = node, Np->inout_p = Np->inout; n->type != NODE_TYPE_END; n++)
        {
-
-               if (Np->type == FROM_CHAR)
+               if (!Np->is_to_char)
                {
                        /*
                         * Check non-string inout end
@@ -4261,7 +4248,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                case NUM_0:
                                case NUM_DEC:
                                case NUM_D:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                        {
                                                NUM_numpart_to_char(Np, n->key->id);
                                                continue;               /* for() */
@@ -4273,7 +4260,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                        }
 
                                case NUM_COMMA:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                        {
                                                if (!Np->num_in)
                                                {
@@ -4284,9 +4271,8 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                                }
                                                else
                                                        *Np->inout_p = ',';
-
                                        }
-                                       else if (Np->type == FROM_CHAR)
+                                       else
                                        {
                                                if (!Np->num_in)
                                                {
@@ -4297,7 +4283,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                        break;
 
                                case NUM_G:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                        {
                                                if (!Np->num_in)
                                                {
@@ -4318,7 +4304,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                                }
 
                                        }
-                                       else if (Np->type == FROM_CHAR)
+                                       else
                                        {
                                                if (!Np->num_in)
                                                {
@@ -4330,13 +4316,13 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                        break;
 
                                case NUM_L:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                        {
                                                strcpy(Np->inout_p, Np->L_currency_symbol);
                                                Np->inout_p += strlen(Np->inout_p) - 1;
 
                                        }
-                                       else if (Np->type == FROM_CHAR)
+                                       else
                                                Np->inout_p += strlen(Np->L_currency_symbol) - 1;
                                        break;
 
@@ -4371,7 +4357,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                                Np->sign == '-' || IS_DECIMAL(Np->Num))
                                                continue;
 
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                                strcpy(Np->inout_p, get_th(Np->number, TH_LOWER));
                                        Np->inout_p += 1;
                                        break;
@@ -4381,13 +4367,13 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                                Np->sign == '-' || IS_DECIMAL(Np->Num))
                                                continue;
 
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                                strcpy(Np->inout_p, get_th(Np->number, TH_UPPER));
                                        Np->inout_p += 1;
                                        break;
 
                                case NUM_MI:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                        {
                                                if (Np->sign == '-')
                                                        *Np->inout_p = '-';
@@ -4397,7 +4383,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                                        *Np->inout_p = ' ';
 
                                        }
-                                       else if (Np->type == FROM_CHAR)
+                                       else
                                        {
                                                if (*Np->inout_p == '-')
                                                        *Np->number = '-';
@@ -4405,7 +4391,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                        break;
 
                                case NUM_PL:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                        {
                                                if (Np->sign == '+')
                                                        *Np->inout_p = '+';
@@ -4415,7 +4401,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                                        *Np->inout_p = ' ';
 
                                        }
-                                       else if (Np->type == FROM_CHAR)
+                                       else
                                        {
                                                if (*Np->inout_p == '+')
                                                        *Np->number = '+';
@@ -4423,10 +4409,10 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                                        break;
 
                                case NUM_SG:
-                                       if (Np->type == TO_CHAR)
+                                       if (Np->is_to_char)
                                                *Np->inout_p = Np->sign;
 
-                                       else if (Np->type == FROM_CHAR)
+                                       else
                                        {
                                                if (*Np->inout_p == '-')
                                                        *Np->number = '-';
@@ -4447,19 +4433,18 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
                        /*
                         * Remove to output char from input in TO_CHAR
                         */
-                       if (Np->type == TO_CHAR)
+                       if (Np->is_to_char)
                                *Np->inout_p = n->character;
                }
                Np->inout_p++;
        }
 
-       if (Np->type == TO_CHAR)
+       if (Np->is_to_char)
        {
                *Np->inout_p = '\0';
                return Np->inout;
-
        }
-       else if (Np->type == FROM_CHAR)
+       else
        {
 
                if (*(Np->number_p - 1) == '.')
@@ -4505,7 +4490,7 @@ do { \
 #define NUM_TOCHAR_finish \
 do { \
        NUM_processor(format, &Num, VARDATA(result),                    \
-               numstr, plen, sign, TO_CHAR);                           \
+               numstr, plen, sign, true);                              \
        pfree(orgnum);                                                  \
                                                                        \
        if (shouldFree)                                                 \
@@ -4557,7 +4542,7 @@ numeric_to_number(PG_FUNCTION_ARGS)
        numstr = (char *) palloc((len * NUM_MAX_ITEM_SIZ) + 1);
 
        NUM_processor(format, &Num, VARDATA(value), numstr,
-                                 VARSIZE(value) - VARHDRSZ, 0, FROM_CHAR);
+                                 VARSIZE(value) - VARHDRSZ, 0, false);
 
        scale = Num.post;
        precision = Max(0, Num.pre) + scale;