Exemplo n.º 1
0
/*
 * Do format conversion placing the output in buffer
 */
static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap) /* {{{ */
{
	char *s = NULL;
	int s_len, free_zcopy;
	zval *zvp, zcopy;

	int min_width = 0;
	int precision = 0;
	enum {
		LEFT, RIGHT
	} adjust;
	char pad_char;
	char prefix_char;

	double fp_num;
	wide_int i_num = (wide_int) 0;
	u_wide_int ui_num;

	char num_buf[NUM_BUF_SIZE];
	char char_buf[2];			/* for printing %% and %<unknown> */

#ifdef HAVE_LOCALE_H
	struct lconv *lconv = NULL;
#endif

	/*
	 * Flag variables
	 */
	length_modifier_e modifier;
	boolean_e alternate_form;
	boolean_e print_sign;
	boolean_e print_blank;
	boolean_e adjust_precision;
	boolean_e adjust_width;
	bool_int is_negative;

	while (*fmt) {
		if (*fmt != '%') {
			INS_CHAR(xbuf, *fmt);
		} else {
			/*
			 * Default variable settings
			 */
			adjust = RIGHT;
			alternate_form = print_sign = print_blank = NO;
			pad_char = ' ';
			prefix_char = NUL;
			free_zcopy = 0;

			fmt++;

			/*
			 * Try to avoid checking for flags, width or precision
			 */
			if (isascii((int)*fmt) && !islower((int)*fmt)) {
				/*
				 * Recognize flags: -, #, BLANK, +
				 */
				for (;; fmt++) {
					if (*fmt == '-')
						adjust = LEFT;
					else if (*fmt == '+')
						print_sign = YES;
					else if (*fmt == '#')
						alternate_form = YES;
					else if (*fmt == ' ')
						print_blank = YES;
					else if (*fmt == '0')
						pad_char = '0';
					else
						break;
				}

				/*
				 * Check if a width was specified
				 */
				if (isdigit((int)*fmt)) {
					STR_TO_DEC(fmt, min_width);
					adjust_width = YES;
				} else if (*fmt == '*') {
					min_width = va_arg(ap, int);
					fmt++;
					adjust_width = YES;
					if (min_width < 0) {
						adjust = LEFT;
						min_width = -min_width;
					}
				} else
					adjust_width = NO;

				/*
				 * Check if a precision was specified
				 */
				if (*fmt == '.') {
					adjust_precision = YES;
					fmt++;
					if (isdigit((int)*fmt)) {
						STR_TO_DEC(fmt, precision);
					} else if (*fmt == '*') {
						precision = va_arg(ap, int);
						fmt++;
						if (precision < 0)
							precision = 0;
					} else
Exemplo n.º 2
0
int Printf::format(const char *fmt, va_list ap) {
    register char *sp;
    register char *bep;
    register int cc = 0;
    register std::size_t i;

    register char *s = NULL;
    char *q;
    std::size_t s_len = 0;

    register size_t min_width = 0;
    std::size_t precision = 0;
    enum {
        LEFT, RIGHT
    } adjust;
    char pad_char;
    char prefix_char;

    double fp_num;
    std::int64_t i_quad = 0;
    std::uint64_t ui_quad;
    std::int32_t i_num = 0;
    std::uint32_t ui_num;

    char num_buf[NUM_BUF_SIZE];
    char char_buf[2];                /* for printing %% and %<unknown> */

    enum var_type_enum {
        IS_QUAD, IS_LONG, IS_SHORT, IS_INT
    };
    enum var_type_enum var_type = IS_INT;

    /*
     * Flag variables
     */
    int alternate_form;
    int print_sign;
    int print_blank;
    int adjust_precision;
    int adjust_width;
    int is_negative;

    sp = _curpos;
    bep = _endpos;

    while (*fmt) {
        if (*fmt != '%') {
            INS_CHAR(*fmt, sp, bep, cc);
        } else {
            /*
             * Default variable settings
             */
            int print_something = 1;
            adjust = RIGHT;
            alternate_form = print_sign = print_blank = 0;
            pad_char = ' ';
            prefix_char = 0;

            fmt++;

            /*
             * Try to avoid checking for flags, width or precision
             */
            if (!islower(*fmt)) {
                /*
                 * Recognize flags: -, #, BLANK, +
                 */
                for (;; fmt++) {
                    if (*fmt == '-')
                        adjust = LEFT;
                    else if (*fmt == '+')
                        print_sign = 1;
                    else if (*fmt == '#')
                        alternate_form = YES;
                    else if (*fmt == ' ')
                        print_blank = 1;
                    else if (*fmt == '0')
                        pad_char = '0';
                    else
                        break;
                }

                /*
                 * Check if a width was specified
                 */
                if (isdigit(*fmt)) {
                    STR_TO_DEC(fmt, min_width);
                    adjust_width = 1;
                } else if (*fmt == '*') {
                    int v = va_arg(ap, int);
                    fmt++;
                    adjust_width = 1;
                    if (v < 0) {
                        adjust = LEFT;
                        min_width = (std::size_t)(-v);
                    } else
                        min_width = (std::size_t)v;
                } else
                    adjust_width = NO;

                /*
                 * Check if a precision was specified
                 */
                if (*fmt == '.') {
                    adjust_precision = 1;
                    fmt++;
                    if (isdigit(*fmt)) {
                        STR_TO_DEC(fmt, precision);
                    } else if (*fmt == '*') {
                        int v = va_arg(ap, int);
                        fmt++;
                        precision = (v < 0) ? 0 : (std::size_t)v;
                    } else
Exemplo n.º 3
0
/*
 * Do format conversion placing the output in buffer
 */
int ap_vformatter(int (*flush_func)(ap_vformatter_buff *),
    ap_vformatter_buff *vbuff, const char *fmt, va_list ap)
{
    register char *sp;
    register char *bep;
    register int cc = 0;
    register int i;

    register char *s = NULL;
    char *q;
    int s_len;

    register int min_width = 0;
    int precision = 0;
    enum {
	LEFT, RIGHT
    } adjust;
    char pad_char;
    char prefix_char;

    double fp_num;
    widest_int i_quad = (widest_int) 0;
    u_widest_int ui_quad;
    wide_int i_num = (wide_int) 0;
    u_wide_int ui_num;

    char num_buf[NUM_BUF_SIZE];
    char char_buf[2];		/* for printing %% and %<unknown> */

    enum var_type_enum {
    	IS_QUAD, IS_LONG, IS_SHORT, IS_INT
    };
    enum var_type_enum var_type = IS_INT;

    /*
     * Flag variables
     */
    boolean_e alternate_form;
    boolean_e print_sign;
    boolean_e print_blank;
    boolean_e adjust_precision;
    boolean_e adjust_width;
    bool_int is_negative;

    sp = vbuff->curpos;
    bep = vbuff->endpos;

    while (*fmt) {
	if (*fmt != '%') {
	    INS_CHAR(*fmt, sp, bep, cc);
	}
	else {
	    /*
	     * Default variable settings
	     */
	    adjust = RIGHT;
	    alternate_form = print_sign = print_blank = NO;
	    pad_char = ' ';
	    prefix_char = NUL;

	    fmt++;

	    /*
	     * Try to avoid checking for flags, width or precision
	     */
	    if (!ap_islower(*fmt)) {
		/*
		 * Recognize flags: -, #, BLANK, +
		 */
		for (;; fmt++) {
		    if (*fmt == '-')
			adjust = LEFT;
		    else if (*fmt == '+')
			print_sign = YES;
		    else if (*fmt == '#')
			alternate_form = YES;
		    else if (*fmt == ' ')
			print_blank = YES;
		    else if (*fmt == '0')
			pad_char = '0';
		    else
			break;
		}

		/*
		 * Check if a width was specified
		 */
		if (ap_isdigit(*fmt)) {
		    STR_TO_DEC(fmt, min_width);
		    adjust_width = YES;
		}
		else if (*fmt == '*') {
		    min_width = va_arg(ap, int);
		    fmt++;
		    adjust_width = YES;
		    if (min_width < 0) {
			adjust = LEFT;
			min_width = -min_width;
		    }
		}
		else
		    adjust_width = NO;

		/*
		 * Check if a precision was specified
		 *
		 * XXX: an unreasonable amount of precision may be specified
		 * resulting in overflow of num_buf. Currently we
		 * ignore this possibility.
		 */
		if (*fmt == '.') {
		    adjust_precision = YES;
		    fmt++;
		    if (ap_isdigit(*fmt)) {
			STR_TO_DEC(fmt, precision);
		    }
		    else if (*fmt == '*') {
			precision = va_arg(ap, int);
			fmt++;
			if (precision < 0)
			    precision = 0;
		    }
		    else
Exemplo n.º 4
0
/*
 * Do format conversion.
 */
SCOPE int
v24_vsnprintf(char *str, size_t size, const char *fmt, va_list ap)
{
   char     *sp;

   char     *bep;

   int       cc = 0;

   int       i = 0;

   char     *s = "";

   char     *q = "";

   int       s_len = 0;

   int       min_width = 0;

   int       precision = 0;

   enum
   {
      LEFT, RIGHT
   } adjust;

   char      pad_char;

   char      prefix_char;

   double    fp_num;

   wide_int  i_num = 0;

   u_wide_int ui_num;

   char      num_buf[NUM_BUF_SIZE];

   char      char_buf[2];	/* for printing %% and %<unknown> */

  /*
   * Flag variables
   */
   boolean_e is_long;

   boolean_e alternate_form;

   boolean_e print_sign;

   boolean_e print_blank;

   boolean_e adjust_precision;

   boolean_e adjust_width;

   bool_int  is_negative;

   if (size == 0)
      return 0;

   sp = str;
   bep = str + size - 1;

   while (*fmt)
    {
       if (*fmt != '%')
	{
	   INS_CHAR(*fmt, sp, bep, cc);
	}
       else
	{
	  /*
	   * Default variable settings
	   */
	   adjust = RIGHT;
	   alternate_form = print_sign = print_blank = NO;
	   pad_char = ' ';
	   prefix_char = NUL;

	   fmt++;

	  /*
	   * Try to avoid checking for flags, width or precision
	   */
	   if (isascii(*fmt) && !islower(*fmt))
	    {
	      /*
	       * Recognize flags: -, #, BLANK, +
	       */
	       for (;; fmt++)
		{
		   if (*fmt == '-')
		      adjust = LEFT;
		   else if (*fmt == '+')
		      print_sign = YES;
		   else if (*fmt == '#')
		      alternate_form = YES;
		   else if (*fmt == ' ')
		      print_blank = YES;
		   else if (*fmt == '0')
		      pad_char = '0';
		   else
		      break;
		}

	      /*
	       * Check if a width was specified
	       */
	       if (isdigit(*fmt))
		{
		   STR_TO_DEC(fmt, min_width);
		   adjust_width = YES;
		}
	       else if (*fmt == '*')
		{
		   min_width = va_arg(ap, int);

		   fmt++;
		   adjust_width = YES;
		   if (min_width < 0)
		    {
		       adjust = LEFT;
		       min_width = -min_width;
		    }
		}
	       else
		  adjust_width = NO;

	      /*
	       * Check if a precision was specified
	       *
	       * XXX: an unreasonable amount of precision may be specified
	       *      resulting in overflow of num_buf. Currently we
	       *      ignore this possibility.
	       */
	       if (*fmt == '.')
		{
		   adjust_precision = YES;
		   fmt++;
		   if (isdigit(*fmt))
		    {
		       STR_TO_DEC(fmt, precision);
		    }
		   else if (*fmt == '*')
		    {
		       precision = va_arg(ap, int);

		       fmt++;
		       if (precision < 0)
			  precision = 0;
		    }
		   else
Exemplo n.º 5
0
/*
 * Do format conversion placing the output in buffer
 */
int vformatter(int (*flush_func)(vformatter_buff_t *),
    vformatter_buff_t *vbuff, const char *fmt, va_list ap)
{
    register char *sp;
    register char *bep;
    register int cc = 0;
    register size_t i;

    register char *s = NULL;
    char *q;
    size_t s_len = 0;

    register size_t min_width = 0;
    size_t precision = 0;
    enum {
        LEFT, RIGHT
    } adjust;
    char pad_char;
    char prefix_char;

    double fp_num;
    int64_t i_quad = 0;
    uint64_t ui_quad;
    int32_t i_num = 0;
    uint32_t ui_num = 0;

    char num_buf[NUM_BUF_SIZE];
    char char_buf[2];                /* for printing %% and %<unknown> */
#ifdef TERM_FMT_SPEC
	char term_buf[TERM_BUF_SIZE];
#endif

    enum var_type_enum {
            IS_QUAD, IS_LONG, IS_SHORT, IS_INT
    };
    enum var_type_enum var_type = IS_INT;

    /*
     * Flag variables
     */
    boolean_e alternate_form;
    boolean_e print_sign;
    boolean_e print_blank;
    boolean_e adjust_precision;
    boolean_e adjust_width;
    int is_negative;

    sp = vbuff->curpos;
    bep = vbuff->endpos;

    while (*fmt) {
        if (*fmt != '%') {
            INS_CHAR(*fmt, sp, bep, cc);
        }
        else {
            /*
             * Default variable settings
             */
            boolean_e print_something = YES;
            adjust = RIGHT;
            alternate_form = print_sign = print_blank = NO;
            pad_char = ' ';
            prefix_char = NUL;

            fmt++;

            /*
             * Try to avoid checking for flags, width or precision
             */
            if (!islower((int)*fmt)) {
                /*
                 * Recognize flags: -, #, BLANK, +
                 */
                for (;; fmt++) {
                    if (*fmt == '-')
                        adjust = LEFT;
                    else if (*fmt == '+')
                        print_sign = YES;
                    else if (*fmt == '#')
                        alternate_form = YES;
                    else if (*fmt == ' ')
                        print_blank = YES;
                    else if (*fmt == '0')
                        pad_char = '0';
                    else
                        break;
                }

                /*
                 * Check if a width was specified
                 */
                if (isdigit((int)*fmt)) {
                    STR_TO_DEC(fmt, min_width);
                    adjust_width = YES;
                }
                else if (*fmt == '*') {
                    int v = va_arg(ap, int);
                    fmt++;
                    adjust_width = YES;
                    if (v < 0) {
                        adjust = LEFT;
                        min_width = (size_t)(-v);
                    }
                    else
                        min_width = (size_t)v;
                }
                else
                    adjust_width = NO;

                /*
                 * Check if a precision was specified
                 */
                if (*fmt == '.') {
                    adjust_precision = YES;
                    fmt++;
                    if (isdigit((int)*fmt)) {
                        STR_TO_DEC(fmt, precision);
                    }
                    else if (*fmt == '*') {
                        int v = va_arg(ap, int);
                        fmt++;
                        precision = (v < 0) ? 0 : (size_t)v;
                    }
                    else