ext/date/date_strftime.c File Reference

#include "ruby/ruby.h"
#include "date_tmx.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>

Go to the source code of this file.

Defines

#define range(low, item, hi)   (item)
#define add(x, y)   (rb_funcall((x), '+', 1, (y)))
#define sub(x, y)   (rb_funcall((x), '-', 1, (y)))
#define mul(x, y)   (rb_funcall((x), '*', 1, (y)))
#define quo(x, y)   (rb_funcall((x), rb_intern("quo"), 1, (y)))
#define div(x, y)   (rb_funcall((x), rb_intern("div"), 1, (y)))
#define mod(x, y)   (rb_funcall((x), '%', 1, (y)))
#define BIT_OF(n)   (1U<<(n))
#define FLAG_FOUND()
#define NEEDS(n)   do if (s >= endp || (n) >= endp - s - 1) goto err; while (0)
#define FILL_PADDING(i)
#define FMT(def_pad, def_prec, fmt, val)
#define STRFTIME(fmt)
#define FMTV(def_pad, def_prec, fmt, val)

Functions

static void upcase (char *s, size_t i)
static void downcase (char *s, size_t i)
static size_t date_strftime_with_tmx (char *s, size_t maxsize, const char *format, const struct tmx *tmx)
size_t date_strftime (char *s, size_t maxsize, const char *format, const struct tmx *tmx)


Define Documentation

#define add ( x,
 )     (rb_funcall((x), '+', 1, (y)))

Definition at line 23 of file date_strftime.c.

Referenced by alt_merge_node_opt_info(), alt_merge_opt_anc_info(), alt_merge_opt_exact_info(), alt_merge_opt_map_info(), concat_left_node_opt_info(), concat_opt_exact_info(), gmtimew_noleapsecond(), onig_chain_link_add(), rb_strftime_with_timespec(), time_mdump(), time_mload(), timegmw_noleapsecond(), timew_out_of_timet_range(), and vtm_add_offset().

#define BIT_OF (  )     (1U<<(n))

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

#define div ( x,
 )     (rb_funcall((x), rb_intern("div"), 1, (y)))

Definition at line 27 of file date_strftime.c.

Referenced by absint_numwords_small(), BigDecimal_div(), BigDecimal_div2(), BigDecimal_divide(), BigDecimal_divmod(), BigDecimal_DoDivmod(), BigDecimal_mod(), date_strftime_with_tmx(), fix_divide(), fix_divmod(), fixdivmod(), flo_divmod(), flodivmod(), iseq_specialized_instruction(), rb_big_divmod(), rb_strftime_with_timespec(), time_mdump(), VpMidRound(), and VpVtoD().

#define FILL_PADDING (  ) 

Value:

do {                                            \
            if (!(flags & BIT_OF(LEFT)) && precision > (i)) {           \
                NEEDS(precision);                                       \
                memset(s, padding ? padding : ' ', precision - (i));    \
                s += precision - (i);                                   \
            }                                                           \
            else {                                                      \
                NEEDS(i);                                               \
            }                                                           \
        } while (0);

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

 
#define FLAG_FOUND (  ) 

Value:

do {                                            \
            if (precision > 0 || flags & (BIT_OF(LOCALE_E) | BIT_OF(LOCALE_O) | BIT_OF(COLONS))) \
                goto unknown;                                           \
        } while (0)

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

#define FMT ( def_pad,
def_prec,
fmt,
val   ) 

Value:

do {                                                            \
            int l;                                                      \
            if (precision <= 0) precision = (def_prec);                 \
            if (flags & BIT_OF(LEFT)) precision = 1;                    \
            l = snprintf(s, endp - s,                                   \
                         ((padding == '0' || (!padding && (def_pad) == '0')) ? \
                          "%0*"fmt : "%*"fmt),                          \
                         precision, (val));                             \
            if (l < 0) goto err;                                        \
            s += l;                                                     \
        } while (0)

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

#define FMTV ( def_pad,
def_prec,
fmt,
val   ) 

Value:

do {                                                            \
            VALUE tmp = (val);                                          \
            if (FIXNUM_P(tmp)) {                                        \
                FMT((def_pad), (def_prec), "l"fmt, FIX2LONG(tmp));      \
            }                                                           \
            else {                                                      \
                VALUE args[2], result;                                  \
                size_t l;                                               \
                if (precision <= 0) precision = (def_prec);             \
                if (flags & BIT_OF(LEFT)) precision = 1;                \
                args[0] = INT2FIX(precision);                           \
                args[1] = (val);                                        \
                if (padding == '0' || (!padding && (def_pad) == '0'))   \
                    result = rb_str_format(2, args, rb_str_new2("%0*"fmt)); \
                else                                                    \
                    result = rb_str_format(2, args, rb_str_new2("%*"fmt)); \
                l = strlcpy(s, StringValueCStr(result), endp - s);      \
                if ((size_t)(endp - s) <= l)                            \
                    goto err;                                           \
                s += l;                                                 \
            }                                                           \
        } while (0)

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

#define mod ( x,
 )     (rb_funcall((x), '%', 1, (y)))

Definition at line 28 of file date_strftime.c.

Referenced by absint_numwords_generic(), absint_numwords_small(), BigDecimal_div2(), BigDecimal_divmod(), BigDecimal_DoDivmod(), BigDecimal_mod(), bigdivmod(), date_strftime_with_tmx(), fix_divmod(), fix_mod(), fixdivmod(), flo_divmod(), flodivmod(), gmtimew_noleapsecond(), guess_local_offset(), iseq_specialized_instruction(), rb_ary_flatten(), rb_ary_flatten_bang(), rb_big_divmod(), rb_module_s_alloc(), rb_str_sum(), rb_strftime_with_timespec(), ruby_float_mod(), time_mdump(), time_round(), and vtm2tm_noyear().

#define mul ( x,
 )     (rb_funcall((x), '*', 1, (y)))

Definition at line 25 of file date_strftime.c.

Referenced by date_strftime_with_tmx(), enum_cycle_size(), gmtimew_noleapsecond(), rb_ary_cycle_size(), rb_strftime_with_timespec(), time_round(), timegmw_noleapsecond(), and timew_out_of_timet_range().

#define NEEDS (  )     do if (s >= endp || (n) >= endp - s - 1) goto err; while (0)

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

#define quo ( x,
 )     (rb_funcall((x), rb_intern("quo"), 1, (y)))

Definition at line 26 of file date_strftime.c.

Referenced by rb_time_unmagnify_to_float(), time_mload(), time_round(), and time_subsec().

#define range ( low,
item,
hi   )     (item)

Definition at line 21 of file date_strftime.c.

Referenced by date_strftime_with_tmx(), enc_succ_alnum_char(), iso2022jp_check_conv(), rb_range_new(), rb_reg_adjust_startpos(), rb_reg_search(), and rb_strftime_with_timespec().

#define STRFTIME ( fmt   ) 

Value:

do {                                                            \
            i = date_strftime_with_tmx(s, endp - s, (fmt), tmx);        \
            if (!i) return 0;                                           \
            if (flags & BIT_OF(UPPER))                                  \
                upcase(s, i);                                           \
            if (!(flags & BIT_OF(LEFT)) && precision > i) {             \
                if (start + maxsize < s + precision) {                  \
                    errno = ERANGE;                                     \
                    return 0;                                           \
                }                                                       \
                memmove(s + precision - i, s, i);                       \
                memset(s, padding ? padding : ' ', precision - i);      \
                s += precision;                                         \
            }                                                           \
            else s += i;                                                \
        } while (0)

Referenced by date_strftime_with_tmx(), and rb_strftime_with_timespec().

#define sub ( x,
 )     (rb_funcall((x), '-', 1, (y)))

Definition at line 24 of file date_strftime.c.

Referenced by rb_str_index_m(), rb_strftime_with_timespec(), time_round(), timegmw_noleapsecond(), timelocalw(), and vtm_add_offset().


Function Documentation

size_t date_strftime ( char *  s,
size_t  maxsize,
const char *  format,
const struct tmx tmx 
)

Definition at line 623 of file date_strftime.c.

References date_strftime_with_tmx().

static size_t date_strftime_with_tmx ( char *  s,
size_t  maxsize,
const char *  format,
const struct tmx tmx 
) [static]

Definition at line 51 of file date_strftime.c.

References args, BIT_OF, div, downcase(), err, errno, FILL_PADDING, FIX2LONG, FIXNUM_P, FLAG_FOUND, FMT, FMTV, INT2FIX, mod, mul, NEEDS, NULL, NUM2INT, range, rb_str_format(), rb_str_new2, result, snprintf, strchr(), STRFTIME, StringValueCStr, strlcpy(), strlen(), tmx_cwday, tmx_cweek, tmx_cwyear, tmx_hour, tmx_mday, tmx_min, tmx_mon, tmx_msecs, tmx_offset, tmx_sec, tmx_sec_fraction, tmx_secs, tmx_wday, tmx_wnum0, tmx_wnum1, tmx_yday, tmx_year, tmx_zone, upcase(), and VALUE.

Referenced by date_strftime().

static void downcase ( char *  s,
size_t  i 
) [static]

Definition at line 40 of file date_strftime.c.

References ISUPPER, and TOLOWER.

Referenced by date_strftime_with_tmx().

static void upcase ( char *  s,
size_t  i 
) [static]

Definition at line 31 of file date_strftime.c.

References ISLOWER, and TOUPPER.

Referenced by date_strftime_with_tmx().


Generated on 19 Jul 2016 for Ruby by  doxygen 1.4.7