static int _dopr ( char * * sbuffer , char * * buffer , size_t * maxlen , size_t * retlen , int * truncated , const char * format , va_list args ) {
 char ch ;
 LLONG value ;
 LDOUBLE fvalue ;
 char * strvalue ;
 int min ;
 int max ;
 int state ;
 int flags ;
 int cflags ;
 size_t currlen ;
 state = DP_S_DEFAULT ;
 flags = currlen = cflags = min = 0 ;
 max = - 1 ;
 ch = * format ++ ;
 while ( state != DP_S_DONE ) {
 if ( ch == '\0' || ( buffer == NULL && currlen >= * maxlen ) ) state = DP_S_DONE ;
 switch ( state ) {
 case DP_S_DEFAULT : if ( ch == '%' ) state = DP_S_FLAGS ;
 else if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , ch ) ) return 0 ;
 ch = * format ++ ;
 break ;
 case DP_S_FLAGS : switch ( ch ) {
 case '-' : flags |= DP_F_MINUS ;
 ch = * format ++ ;
 break ;
 case '+' : flags |= DP_F_PLUS ;
 ch = * format ++ ;
 break ;
 case ' ' : flags |= DP_F_SPACE ;
 ch = * format ++ ;
 break ;
 case '#' : flags |= DP_F_NUM ;
 ch = * format ++ ;
 break ;
 case '0' : flags |= DP_F_ZERO ;
 ch = * format ++ ;
 break ;
 default : state = DP_S_MIN ;
 break ;
 }
 break ;
 case DP_S_MIN : if ( isdigit ( ( unsigned char ) ch ) ) {
 min = 10 * min + char_to_int ( ch ) ;
 ch = * format ++ ;
 }
 else if ( ch == '*' ) {
 min = va_arg ( args , int ) ;
 ch = * format ++ ;
 state = DP_S_DOT ;
 }
 else state = DP_S_DOT ;
 break ;
 case DP_S_DOT : if ( ch == '.' ) {
 state = DP_S_MAX ;
 ch = * format ++ ;
 }
 else state = DP_S_MOD ;
 break ;
 case DP_S_MAX : if ( isdigit ( ( unsigned char ) ch ) ) {
 if ( max < 0 ) max = 0 ;
 max = 10 * max + char_to_int ( ch ) ;
 ch = * format ++ ;
 }
 else if ( ch == '*' ) {
 max = va_arg ( args , int ) ;
 ch = * format ++ ;
 state = DP_S_MOD ;
 }
 else state = DP_S_MOD ;
 break ;
 case DP_S_MOD : switch ( ch ) {
 case 'h' : cflags = DP_C_SHORT ;
 ch = * format ++ ;
 break ;
 case 'l' : if ( * format == 'l' ) {
 cflags = DP_C_LLONG ;
 format ++ ;
 }
 else cflags = DP_C_LONG ;
 ch = * format ++ ;
 break ;
 case 'q' : cflags = DP_C_LLONG ;
 ch = * format ++ ;
 break ;
 case 'L' : cflags = DP_C_LDOUBLE ;
 ch = * format ++ ;
 break ;
 default : break ;
 }
 state = DP_S_CONV ;
 break ;
 case DP_S_CONV : switch ( ch ) {
 case 'd' : case 'i' : switch ( cflags ) {
 case DP_C_SHORT : value = ( short int ) va_arg ( args , int ) ;
 break ;
 case DP_C_LONG : value = va_arg ( args , long int ) ;
 break ;
 case DP_C_LLONG : value = va_arg ( args , LLONG ) ;
 break ;
 default : value = va_arg ( args , int ) ;
 break ;
 }
 if ( ! fmtint ( sbuffer , buffer , & currlen , maxlen , value , 10 , min , max , flags ) ) return 0 ;
 break ;
 case 'X' : flags |= DP_F_UP ;
 case 'x' : case 'o' : case 'u' : flags |= DP_F_UNSIGNED ;
 switch ( cflags ) {
 case DP_C_SHORT : value = ( unsigned short int ) va_arg ( args , unsigned int ) ;
 break ;
 case DP_C_LONG : value = ( LLONG ) va_arg ( args , unsigned long int ) ;
 break ;
 case DP_C_LLONG : value = va_arg ( args , unsigned LLONG ) ;
 break ;
 default : value = ( LLONG ) va_arg ( args , unsigned int ) ;
 break ;
 }
 if ( ! fmtint ( sbuffer , buffer , & currlen , maxlen , value , ch == 'o' ? 8 : ( ch == 'u' ? 10 : 16 ) , min , max , flags ) ) return 0 ;
 break ;
 case 'f' : if ( cflags == DP_C_LDOUBLE ) fvalue = va_arg ( args , LDOUBLE ) ;
 else fvalue = va_arg ( args , double ) ;
 if ( ! fmtfp ( sbuffer , buffer , & currlen , maxlen , fvalue , min , max , flags ) ) return 0 ;
 break ;
 case 'E' : flags |= DP_F_UP ;
 case 'e' : if ( cflags == DP_C_LDOUBLE ) fvalue = va_arg ( args , LDOUBLE ) ;
 else fvalue = va_arg ( args , double ) ;
 break ;
 case 'G' : flags |= DP_F_UP ;
 case 'g' : if ( cflags == DP_C_LDOUBLE ) fvalue = va_arg ( args , LDOUBLE ) ;
 else fvalue = va_arg ( args , double ) ;
 break ;
 case 'c' : if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , va_arg ( args , int ) ) ) return 0 ;
 break ;
 case 's' : strvalue = va_arg ( args , char * ) ;
 if ( max < 0 ) {
 if ( buffer ) max = INT_MAX ;
 else max = * maxlen ;
 }
 if ( ! fmtstr ( sbuffer , buffer , & currlen , maxlen , strvalue , flags , min , max ) ) return 0 ;
 break ;
 case 'p' : value = ( long ) va_arg ( args , void * ) ;
 if ( ! fmtint ( sbuffer , buffer , & currlen , maxlen , value , 16 , min , max , flags | DP_F_NUM ) ) return 0 ;
 break ;
 case 'n' : if ( cflags == DP_C_SHORT ) {
 short int * num ;
 num = va_arg ( args , short int * ) ;
 * num = currlen ;
 }
 else if ( cflags == DP_C_LONG ) {
 long int * num ;
 num = va_arg ( args , long int * ) ;
 * num = ( long int ) currlen ;
 }
 else if ( cflags == DP_C_LLONG ) {
 LLONG * num ;
 num = va_arg ( args , LLONG * ) ;
 * num = ( LLONG ) currlen ;
 }
 else {
 int * num ;
 num = va_arg ( args , int * ) ;
 * num = currlen ;
 }
 break ;
 case '%' : if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , ch ) ) return 0 ;
 break ;
 case 'w' : ch = * format ++ ;
 break ;
 default : break ;
 }
 ch = * format ++ ;
 state = DP_S_DEFAULT ;
 flags = cflags = min = 0 ;
 max = - 1 ;
 break ;
 case DP_S_DONE : break ;
 default : break ;
 }
 }
 * truncated = ( currlen > * maxlen - 1 ) ;
 if ( * truncated ) currlen = * maxlen - 1 ;
 if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , '\0' ) ) return 0 ;
 * retlen = currlen - 1 ;
 return 1 ;
 }
static int _dopr ( char * * sbuffer , char * * buffer , size_t * maxlen , size_t * retlen , int * truncated , const char * format , va_list args ) {
 char ch ;
 LLONG value ;
 LDOUBLE fvalue ;
 char * strvalue ;
 int min ;
 int max ;
 int state ;
 int flags ;
 int cflags ;
 size_t currlen ;
 state = DP_S_DEFAULT ;
 flags = currlen = cflags = min = 0 ;
 max = - 1 ;
 ch = * format ++ ;
 while ( state != DP_S_DONE ) {
 if ( ch == '\0' || ( buffer == NULL && currlen >= * maxlen ) ) state = DP_S_DONE ;
 switch ( state ) {
 case DP_S_DEFAULT : if ( ch == '%' ) state = DP_S_FLAGS ;
 else if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , ch ) ) return 0 ;
 ch = * format ++ ;
 break ;
 case DP_S_FLAGS : switch ( ch ) {
 case '-' : flags |= DP_F_MINUS ;
 ch = * format ++ ;
 break ;
 case '+' : flags |= DP_F_PLUS ;
 ch = * format ++ ;
 break ;
 case ' ' : flags |= DP_F_SPACE ;
 ch = * format ++ ;
 break ;
 case '#' : flags |= DP_F_NUM ;
 ch = * format ++ ;
 break ;
 case '0' : flags |= DP_F_ZERO ;
 ch = * format ++ ;
 break ;
 default : state = DP_S_MIN ;
 break ;
 }
 break ;
 case DP_S_MIN : if ( isdigit ( ( unsigned char ) ch ) ) {
 min = 10 * min + char_to_int ( ch ) ;
 ch = * format ++ ;
 }
 else if ( ch == '*' ) {
 min = va_arg ( args , int ) ;
 ch = * format ++ ;
 state = DP_S_DOT ;
 }
 else state = DP_S_DOT ;
 break ;
 case DP_S_DOT : if ( ch == '.' ) {
 state = DP_S_MAX ;
 ch = * format ++ ;
 }
 else state = DP_S_MOD ;
 break ;
 case DP_S_MAX : if ( isdigit ( ( unsigned char ) ch ) ) {
 if ( max < 0 ) max = 0 ;
 max = 10 * max + char_to_int ( ch ) ;
 ch = * format ++ ;
 }
 else if ( ch == '*' ) {
 max = va_arg ( args , int ) ;
 ch = * format ++ ;
 state = DP_S_MOD ;
 }
 else state = DP_S_MOD ;
 break ;
 case DP_S_MOD : switch ( ch ) {
 case 'h' : cflags = DP_C_SHORT ;
 ch = * format ++ ;
 break ;
 case 'l' : if ( * format == 'l' ) {
 cflags = DP_C_LLONG ;
 format ++ ;
 }
 else cflags = DP_C_LONG ;
 ch = * format ++ ;
 break ;
 case 'q' : cflags = DP_C_LLONG ;
 ch = * format ++ ;
 break ;
 case 'L' : cflags = DP_C_LDOUBLE ;
 ch = * format ++ ;
 break ;
 default : break ;
 }
 state = DP_S_CONV ;
 break ;
 case DP_S_CONV : switch ( ch ) {
 case 'd' : case 'i' : switch ( cflags ) {
 case DP_C_SHORT : value = ( short int ) va_arg ( args , int ) ;
 break ;
 case DP_C_LONG : value = va_arg ( args , long int ) ;
 break ;
 case DP_C_LLONG : value = va_arg ( args , LLONG ) ;
 break ;
 default : value = va_arg ( args , int ) ;
 break ;
 }
 if ( ! fmtint ( sbuffer , buffer , & currlen , maxlen , value , 10 , min , max , flags ) ) return 0 ;
 break ;
 case 'X' : flags |= DP_F_UP ;
 case 'x' : case 'o' : case 'u' : flags |= DP_F_UNSIGNED ;
 switch ( cflags ) {
 case DP_C_SHORT : value = ( unsigned short int ) va_arg ( args , unsigned int ) ;
 break ;
 case DP_C_LONG : value = ( LLONG ) va_arg ( args , unsigned long int ) ;
 break ;
 case DP_C_LLONG : value = va_arg ( args , unsigned LLONG ) ;
 break ;
 default : value = ( LLONG ) va_arg ( args , unsigned int ) ;
 break ;
 }
 if ( ! fmtint ( sbuffer , buffer , & currlen , maxlen , value , ch == 'o' ? 8 : ( ch == 'u' ? 10 : 16 ) , min , max , flags ) ) return 0 ;
 break ;
 case 'f' : if ( cflags == DP_C_LDOUBLE ) fvalue = va_arg ( args , LDOUBLE ) ;
 else fvalue = va_arg ( args , double ) ;
 if ( ! fmtfp ( sbuffer , buffer , & currlen , maxlen , fvalue , min , max , flags ) ) return 0 ;
 break ;
 case 'E' : flags |= DP_F_UP ;
 case 'e' : if ( cflags == DP_C_LDOUBLE ) fvalue = va_arg ( args , LDOUBLE ) ;
 else fvalue = va_arg ( args , double ) ;
 break ;
 case 'G' : flags |= DP_F_UP ;
 case 'g' : if ( cflags == DP_C_LDOUBLE ) fvalue = va_arg ( args , LDOUBLE ) ;
 else fvalue = va_arg ( args , double ) ;
 break ;
 case 'c' : if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , va_arg ( args , int ) ) ) return 0 ;
 break ;
 case 's' : strvalue = va_arg ( args , char * ) ;
 if ( max < 0 ) {
 if ( buffer ) max = INT_MAX ;
 else max = * maxlen ;
 }
 if ( ! fmtstr ( sbuffer , buffer , & currlen , maxlen , strvalue , flags , min , max ) ) return 0 ;
 break ;
 case 'p' : value = ( long ) va_arg ( args , void * ) ;
 if ( ! fmtint ( sbuffer , buffer , & currlen , maxlen , value , 16 , min , max , flags | DP_F_NUM ) ) return 0 ;
 break ;
 case 'n' : if ( cflags == DP_C_SHORT ) {
 short int * num ;
 num = va_arg ( args , short int * ) ;
 * num = currlen ;
 }
 else if ( cflags == DP_C_LONG ) {
 long int * num ;
 num = va_arg ( args , long int * ) ;
 * num = ( long int ) currlen ;
 }
 else if ( cflags == DP_C_LLONG ) {
 LLONG * num ;
 num = va_arg ( args , LLONG * ) ;
 * num = ( LLONG ) currlen ;
 }
 else {
 int * num ;
 num = va_arg ( args , int * ) ;
 * num = currlen ;
 }
 break ;
 case '%' : if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , ch ) ) return 0 ;
 break ;
 case 'w' : ch = * format ++ ;
 break ;
 default : break ;
 }
 ch = * format ++ ;
 state = DP_S_DEFAULT ;
 flags = cflags = min = 0 ;
 max = - 1 ;
 break ;
 case DP_S_DONE : break ;
 default : break ;
 }
 }
 * truncated = ( currlen > * maxlen - 1 ) ;
 if ( * truncated ) currlen = * maxlen - 1 ;
 if ( ! doapr_outch ( sbuffer , buffer , & currlen , maxlen , '\0' ) ) return 0 ;
 * retlen = currlen - 1 ;
 return 1 ;
 }