snprintf.c

ソースコードを見る。


関数

void dummy_snprintf (void)
static size_t dopr (char *buffer, size_t maxlen, const char *format, va_list args_in)
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen, char *value, int flags, int min, int max)
static void fmtint (char *buffer, size_t *currlen, size_t maxlen, long value, int base, int min, int max, int flags)
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue, int min, int max, int flags)
static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
static LDOUBLE abs_val (LDOUBLE value)
static LDOUBLE POW10 (int exp)
static LLONG ROUND (LDOUBLE value)
static double my_modf (double x0, double *iptr)
int rsync_vsnprintf (char *str, size_t count, const char *fmt, va_list args)
int rsync_snprintf (char *str, size_t count, const char *fmt,...)
int vasprintf (char **ptr, const char *format, va_list ap)
int asprintf (char **ptr, const char *format,...)
int sprintf (char *str, const char *fmt,...)
int main (void)

関数

void dummy_snprintf ( void   ) 

snprintf.c133 行で定義されています。

00133 {} 

static size_t dopr ( char *  buffer,
size_t  maxlen,
const char *  format,
va_list  args_in 
) [static]

snprintf.c206 行で定義されています。

参照先 dopr_outch()fmtfp()fmtint()fmtstr()value.

参照元 rsync_vsnprintf().

00207 {
00208         char ch;
00209         LLONG value;
00210         LDOUBLE fvalue;
00211         char *strvalue;
00212         int min;
00213         int max;
00214         int state;
00215         int flags;
00216         int cflags;
00217         size_t currlen;
00218         va_list args;
00219 
00220         VA_COPY(args, args_in);
00221         
00222         state = DP_S_DEFAULT;
00223         currlen = flags = cflags = min = 0;
00224         max = -1;
00225         ch = *format++;
00226         
00227         while (state != DP_S_DONE) {
00228                 if (ch == '\0') 
00229                         state = DP_S_DONE;
00230 
00231                 switch(state) {
00232                 case DP_S_DEFAULT:
00233                         if (ch == '%') 
00234                                 state = DP_S_FLAGS;
00235                         else 
00236                                 dopr_outch (buffer, &currlen, maxlen, ch);
00237                         ch = *format++;
00238                         break;
00239                 case DP_S_FLAGS:
00240                         switch (ch) {
00241                         case '-':
00242                                 flags |= DP_F_MINUS;
00243                                 ch = *format++;
00244                                 break;
00245                         case '+':
00246                                 flags |= DP_F_PLUS;
00247                                 ch = *format++;
00248                                 break;
00249                         case ' ':
00250                                 flags |= DP_F_SPACE;
00251                                 ch = *format++;
00252                                 break;
00253                         case '#':
00254                                 flags |= DP_F_NUM;
00255                                 ch = *format++;
00256                                 break;
00257                         case '0':
00258                                 flags |= DP_F_ZERO;
00259                                 ch = *format++;
00260                                 break;
00261                         default:
00262                                 state = DP_S_MIN;
00263                                 break;
00264                         }
00265                         break;
00266                 case DP_S_MIN:
00267                         if (isdigit((unsigned char)ch)) {
00268                                 min = 10*min + char_to_int (ch);
00269                                 ch = *format++;
00270                         } else if (ch == '*') {
00271                                 min = va_arg (args, int);
00272                                 ch = *format++;
00273                                 state = DP_S_DOT;
00274                         } else {
00275                                 state = DP_S_DOT;
00276                         }
00277                         break;
00278                 case DP_S_DOT:
00279                         if (ch == '.') {
00280                                 state = DP_S_MAX;
00281                                 ch = *format++;
00282                         } else { 
00283                                 state = DP_S_MOD;
00284                         }
00285                         break;
00286                 case DP_S_MAX:
00287                         if (isdigit((unsigned char)ch)) {
00288                                 if (max < 0)
00289                                         max = 0;
00290                                 max = 10*max + char_to_int (ch);
00291                                 ch = *format++;
00292                         } else if (ch == '*') {
00293                                 max = va_arg (args, int);
00294                                 ch = *format++;
00295                                 state = DP_S_MOD;
00296                         } else {
00297                                 state = DP_S_MOD;
00298                         }
00299                         break;
00300                 case DP_S_MOD:
00301                         switch (ch) {
00302                         case 'h':
00303                                 cflags = DP_C_SHORT;
00304                                 ch = *format++;
00305                                 break;
00306                         case 'l':
00307                                 cflags = DP_C_LONG;
00308                                 ch = *format++;
00309                                 if (ch == 'l') {        /* It's a long long */
00310                                         cflags = DP_C_LLONG;
00311                                         ch = *format++;
00312                                 }
00313                                 break;
00314                         case 'L':
00315                                 cflags = DP_C_LDOUBLE;
00316                                 ch = *format++;
00317                                 break;
00318                         default:
00319                                 break;
00320                         }
00321                         state = DP_S_CONV;
00322                         break;
00323                 case DP_S_CONV:
00324                         switch (ch) {
00325                         case 'd':
00326                         case 'i':
00327                                 if (cflags == DP_C_SHORT) 
00328                                         value = va_arg (args, int);
00329                                 else if (cflags == DP_C_LONG)
00330                                         value = va_arg (args, long int);
00331                                 else if (cflags == DP_C_LLONG)
00332                                         value = va_arg (args, LLONG);
00333                                 else
00334                                         value = va_arg (args, int);
00335                                 fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
00336                                 break;
00337                         case 'o':
00338                                 flags |= DP_F_UNSIGNED;
00339                                 if (cflags == DP_C_SHORT)
00340                                         value = va_arg (args, unsigned int);
00341                                 else if (cflags == DP_C_LONG)
00342                                         value = (long)va_arg (args, unsigned long int);
00343                                 else if (cflags == DP_C_LLONG)
00344                                         value = (long)va_arg (args, unsigned LLONG);
00345                                 else
00346                                         value = (long)va_arg (args, unsigned int);
00347                                 fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
00348                                 break;
00349                         case 'u':
00350                                 flags |= DP_F_UNSIGNED;
00351                                 if (cflags == DP_C_SHORT)
00352                                         value = va_arg (args, unsigned int);
00353                                 else if (cflags == DP_C_LONG)
00354                                         value = (long)va_arg (args, unsigned long int);
00355                                 else if (cflags == DP_C_LLONG)
00356                                         value = (LLONG)va_arg (args, unsigned LLONG);
00357                                 else
00358                                         value = (long)va_arg (args, unsigned int);
00359                                 fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
00360                                 break;
00361                         case 'X':
00362                                 flags |= DP_F_UP;
00363                         case 'x':
00364                                 flags |= DP_F_UNSIGNED;
00365                                 if (cflags == DP_C_SHORT)
00366                                         value = va_arg (args, unsigned int);
00367                                 else if (cflags == DP_C_LONG)
00368                                         value = (long)va_arg (args, unsigned long int);
00369                                 else if (cflags == DP_C_LLONG)
00370                                         value = (LLONG)va_arg (args, unsigned LLONG);
00371                                 else
00372                                         value = (long)va_arg (args, unsigned int);
00373                                 fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
00374                                 break;
00375                         case 'f':
00376                                 if (cflags == DP_C_LDOUBLE)
00377                                         fvalue = va_arg (args, LDOUBLE);
00378                                 else
00379                                         fvalue = va_arg (args, double);
00380                                 /* um, floating point? */
00381                                 fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
00382                                 break;
00383                         case 'E':
00384                                 flags |= DP_F_UP;
00385                         case 'e':
00386                                 if (cflags == DP_C_LDOUBLE)
00387                                         fvalue = va_arg (args, LDOUBLE);
00388                                 else
00389                                         fvalue = va_arg (args, double);
00390                                 fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
00391                                 break;
00392                         case 'G':
00393                                 flags |= DP_F_UP;
00394                         case 'g':
00395                                 if (cflags == DP_C_LDOUBLE)
00396                                         fvalue = va_arg (args, LDOUBLE);
00397                                 else
00398                                         fvalue = va_arg (args, double);
00399                                 fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
00400                                 break;
00401                         case 'c':
00402                                 dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
00403                                 break;
00404                         case 's':
00405                                 strvalue = va_arg (args, char *);
00406                                 if (!strvalue) strvalue = "(NULL)";
00407                                 if (max == -1) {
00408                                         max = strlen(strvalue);
00409                                 }
00410                                 if (min > 0 && max >= 0 && min > max) max = min;
00411                                 fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
00412                                 break;
00413                         case 'p':
00414                                 strvalue = va_arg (args, void *);
00415                                 fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
00416                                 break;
00417                         case 'n':
00418                                 if (cflags == DP_C_SHORT) {
00419                                         short int *num;
00420                                         num = va_arg (args, short int *);
00421                                         *num = currlen;
00422                                 } else if (cflags == DP_C_LONG) {
00423                                         long int *num;
00424                                         num = va_arg (args, long int *);
00425                                         *num = (long int)currlen;
00426                                 } else if (cflags == DP_C_LLONG) {
00427                                         LLONG *num;
00428                                         num = va_arg (args, LLONG *);
00429                                         *num = (LLONG)currlen;
00430                                 } else {
00431                                         int *num;
00432                                         num = va_arg (args, int *);
00433                                         *num = currlen;
00434                                 }
00435                                 break;
00436                         case '%':
00437                                 dopr_outch (buffer, &currlen, maxlen, ch);
00438                                 break;
00439                         case 'w':
00440                                 /* not supported yet, treat as next char */
00441                                 ch = *format++;
00442                                 break;
00443                         default:
00444                                 /* Unknown, skip */
00445                                 break;
00446                         }
00447                         ch = *format++;
00448                         state = DP_S_DEFAULT;
00449                         flags = cflags = min = 0;
00450                         max = -1;
00451                         break;
00452                 case DP_S_DONE:
00453                         break;
00454                 default:
00455                         /* hmm? */
00456                         break; /* some picky compilers need this */
00457                 }
00458         }
00459         if (maxlen != 0) {
00460                 if (currlen < maxlen - 1) 
00461                         buffer[currlen] = '\0';
00462                 else if (maxlen > 0) 
00463                         buffer[maxlen - 1] = '\0';
00464         }
00465         
00466         return currlen;
00467 }

static void fmtstr ( char *  buffer,
size_t *  currlen,
size_t  maxlen,
char *  value,
int  flags,
int  min,
int  max 
) [static]

snprintf.c469 行で定義されています。

参照先 dopr_outch().

参照元 dopr().

00471 {
00472         int padlen, strln;     /* amount to pad */
00473         int cnt = 0;
00474 
00475 #ifdef DEBUG_SNPRINTF
00476         printf("fmtstr min=%d max=%d s=[%s]\n", min, max, value);
00477 #endif
00478         if (value == 0) {
00479                 value = "<NULL>";
00480         }
00481 
00482         for (strln = 0; value[strln]; ++strln); /* strlen */
00483         padlen = min - strln;
00484         if (padlen < 0) 
00485                 padlen = 0;
00486         if (flags & DP_F_MINUS) 
00487                 padlen = -padlen; /* Left Justify */
00488         
00489         while ((padlen > 0) && (cnt < max)) {
00490                 dopr_outch (buffer, currlen, maxlen, ' ');
00491                 --padlen;
00492                 ++cnt;
00493         }
00494         while (*value && (cnt < max)) {
00495                 dopr_outch (buffer, currlen, maxlen, *value++);
00496                 ++cnt;
00497         }
00498         while ((padlen < 0) && (cnt < max)) {
00499                 dopr_outch (buffer, currlen, maxlen, ' ');
00500                 ++padlen;
00501                 ++cnt;
00502         }
00503 }

static void fmtint ( char *  buffer,
size_t *  currlen,
size_t  maxlen,
long  value,
int  base,
int  min,
int  max,
int  flags 
) [static]

snprintf.c507 行で定義されています。

参照先 dopr_outch().

参照元 dopr().

00509 {
00510         int signvalue = 0;
00511         unsigned long uvalue;
00512         char convert[20];
00513         int place = 0;
00514         int spadlen = 0; /* amount to space pad */
00515         int zpadlen = 0; /* amount to zero pad */
00516         int caps = 0;
00517         
00518         if (max < 0)
00519                 max = 0;
00520         
00521         uvalue = value;
00522         
00523         if(!(flags & DP_F_UNSIGNED)) {
00524                 if( value < 0 ) {
00525                         signvalue = '-';
00526                         uvalue = -value;
00527                 } else {
00528                         if (flags & DP_F_PLUS)  /* Do a sign (+/i) */
00529                                 signvalue = '+';
00530                         else if (flags & DP_F_SPACE)
00531                                 signvalue = ' ';
00532                 }
00533         }
00534   
00535         if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
00536 
00537         do {
00538                 convert[place++] =
00539                         (caps? "0123456789ABCDEF":"0123456789abcdef")
00540                         [uvalue % (unsigned)base  ];
00541                 uvalue = (uvalue / (unsigned)base );
00542         } while(uvalue && (place < 20));
00543         if (place == 20) place--;
00544         convert[place] = 0;
00545 
00546         zpadlen = max - place;
00547         spadlen = min - MAX (max, place) - (signvalue ? 1 : 0);
00548         if (zpadlen < 0) zpadlen = 0;
00549         if (spadlen < 0) spadlen = 0;
00550         if (flags & DP_F_ZERO) {
00551                 zpadlen = MAX(zpadlen, spadlen);
00552                 spadlen = 0;
00553         }
00554         if (flags & DP_F_MINUS) 
00555                 spadlen = -spadlen; /* Left Justifty */
00556 
00557 #ifdef DEBUG_SNPRINTF
00558         printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
00559                zpadlen, spadlen, min, max, place);
00560 #endif
00561 
00562         /* Spaces */
00563         while (spadlen > 0) {
00564                 dopr_outch (buffer, currlen, maxlen, ' ');
00565                 --spadlen;
00566         }
00567 
00568         /* Sign */
00569         if (signvalue) 
00570                 dopr_outch (buffer, currlen, maxlen, signvalue);
00571 
00572         /* Zeros */
00573         if (zpadlen > 0) {
00574                 while (zpadlen > 0) {
00575                         dopr_outch (buffer, currlen, maxlen, '0');
00576                         --zpadlen;
00577                 }
00578         }
00579 
00580         /* Digits */
00581         while (place > 0) 
00582                 dopr_outch (buffer, currlen, maxlen, convert[--place]);
00583   
00584         /* Left Justified spaces */
00585         while (spadlen < 0) {
00586                 dopr_outch (buffer, currlen, maxlen, ' ');
00587                 ++spadlen;
00588         }
00589 }

static void fmtfp ( char *  buffer,
size_t *  currlen,
size_t  maxlen,
LDOUBLE  fvalue,
int  min,
int  max,
int  flags 
) [static]

snprintf.c658 行で定義されています。

参照先 abs_val()dopr_outch()my_modf()POW10()ROUND().

参照元 dopr().

00660 {
00661         int signvalue = 0;
00662         double ufvalue;
00663         char iconvert[311];
00664         char fconvert[311];
00665         int iplace = 0;
00666         int fplace = 0;
00667         int padlen = 0; /* amount to pad */
00668         int zpadlen = 0; 
00669         int caps = 0;
00670         int idx;
00671         double intpart;
00672         double fracpart;
00673         double temp;
00674   
00675         /* 
00676          * AIX manpage says the default is 0, but Solaris says the default
00677          * is 6, and sprintf on AIX defaults to 6
00678          */
00679         if (max < 0)
00680                 max = 6;
00681 
00682         ufvalue = abs_val (fvalue);
00683 
00684         if (fvalue < 0) {
00685                 signvalue = '-';
00686         } else {
00687                 if (flags & DP_F_PLUS) { /* Do a sign (+/i) */
00688                         signvalue = '+';
00689                 } else {
00690                         if (flags & DP_F_SPACE)
00691                                 signvalue = ' ';
00692                 }
00693         }
00694 
00695 #if 0
00696         if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
00697 #endif
00698 
00699 #if 0
00700          if (max == 0) ufvalue += 0.5; /* if max = 0 we must round */
00701 #endif
00702 
00703         /* 
00704          * Sorry, we only support 16 digits past the decimal because of our 
00705          * conversion method
00706          */
00707         if (max > 16)
00708                 max = 16;
00709 
00710         /* We "cheat" by converting the fractional part to integer by
00711          * multiplying by a factor of 10
00712          */
00713 
00714         temp = ufvalue;
00715         my_modf(temp, &intpart);
00716 
00717         fracpart = ROUND((POW10(max)) * (ufvalue - intpart));
00718         
00719         if (fracpart >= POW10(max)) {
00720                 intpart++;
00721                 fracpart -= POW10(max);
00722         }
00723 
00724 
00725         /* Convert integer part */
00726         do {
00727                 temp = intpart*0.1;
00728                 my_modf(temp, &intpart);
00729                 idx = (int) ((temp -intpart +0.05)* 10.0);
00730                 /* idx = (int) (((double)(temp*0.1) -intpart +0.05) *10.0); */
00731                 /* printf ("%llf, %f, %x\n", temp, intpart, idx); */
00732                 iconvert[iplace++] =
00733                         (caps? "0123456789ABCDEF":"0123456789abcdef")[idx];
00734         } while (intpart && (iplace < 311));
00735         if (iplace == 311) iplace--;
00736         iconvert[iplace] = 0;
00737 
00738         /* Convert fractional part */
00739         if (fracpart)
00740         {
00741                 do {
00742                         temp = fracpart*0.1;
00743                         my_modf(temp, &fracpart);
00744                         idx = (int) ((temp -fracpart +0.05)* 10.0);
00745                         /* idx = (int) ((((temp/10) -fracpart) +0.05) *10); */
00746                         /* printf ("%lf, %lf, %ld\n", temp, fracpart, idx ); */
00747                         fconvert[fplace++] =
00748                         (caps? "0123456789ABCDEF":"0123456789abcdef")[idx];
00749                 } while(fracpart && (fplace < 311));
00750                 if (fplace == 311) fplace--;
00751         }
00752         fconvert[fplace] = 0;
00753   
00754         /* -1 for decimal point, another -1 if we are printing a sign */
00755         padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); 
00756         zpadlen = max - fplace;
00757         if (zpadlen < 0) zpadlen = 0;
00758         if (padlen < 0) 
00759                 padlen = 0;
00760         if (flags & DP_F_MINUS) 
00761                 padlen = -padlen; /* Left Justifty */
00762         
00763         if ((flags & DP_F_ZERO) && (padlen > 0)) {
00764                 if (signvalue) {
00765                         dopr_outch (buffer, currlen, maxlen, signvalue);
00766                         --padlen;
00767                         signvalue = 0;
00768                 }
00769                 while (padlen > 0) {
00770                         dopr_outch (buffer, currlen, maxlen, '0');
00771                         --padlen;
00772                 }
00773         }
00774         while (padlen > 0) {
00775                 dopr_outch (buffer, currlen, maxlen, ' ');
00776                 --padlen;
00777         }
00778         if (signvalue) 
00779                 dopr_outch (buffer, currlen, maxlen, signvalue);
00780         
00781         while (iplace > 0) 
00782                 dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
00783 
00784 #ifdef DEBUG_SNPRINTF
00785         printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen);
00786 #endif
00787 
00788         /*
00789          * Decimal point.  This should probably use locale to find the correct
00790          * char to print out.
00791          */
00792         if (max > 0) {
00793                 dopr_outch (buffer, currlen, maxlen, '.');
00794                 
00795                 while (zpadlen > 0) {
00796                         dopr_outch (buffer, currlen, maxlen, '0');
00797                         --zpadlen;
00798                 }
00799 
00800                 while (fplace > 0) 
00801                         dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
00802         }
00803 
00804         while (padlen < 0) {
00805                 dopr_outch (buffer, currlen, maxlen, ' ');
00806                 ++padlen;
00807         }
00808 }

static void dopr_outch ( char *  buffer,
size_t *  currlen,
size_t  maxlen,
char  c 
) [static]

snprintf.c810 行で定義されています。

参照元 dopr()fmtfp()fmtint()fmtstr().

00811 {
00812         if (*currlen < maxlen) {
00813                 buffer[(*currlen)] = c;
00814         }
00815         (*currlen)++;
00816 }

static LDOUBLE abs_val ( LDOUBLE  value  )  [static]

snprintf.c591 行で定義されています。

参照元 fmtfp().

00592 {
00593         LDOUBLE result = value;
00594 
00595         if (value < 0)
00596                 result = -value;
00597         
00598         return result;
00599 }

static LDOUBLE POW10 ( int  exp  )  [static]

snprintf.c601 行で定義されています。

参照元 fmtfp().

00602 {
00603         LDOUBLE result = 1;
00604         
00605         while (exp) {
00606                 result *= 10;
00607                 exp--;
00608         }
00609   
00610         return result;
00611 }

static LLONG ROUND ( LDOUBLE  value  )  [static]

snprintf.c613 行で定義されています。

参照元 fmtfp().

00614 {
00615         LLONG intpart;
00616 
00617         intpart = (LLONG)value;
00618         value = value - intpart;
00619         if (value >= 0.5) intpart++;
00620         
00621         return intpart;
00622 }

static double my_modf ( double  x0,
double *  iptr 
) [static]

snprintf.c626 行で定義されています。

参照元 fmtfp().

00627 {
00628         int i;
00629         long l;
00630         double x = x0;
00631         double f = 1.0;
00632 
00633         for (i=0;i<100;i++) {
00634                 l = (long)x;
00635                 if (l <= (x+1) && l >= (x-1)) {
00636                         if (i != 0) {
00637                                 double i2;
00638                                 double ret;
00639 
00640                                 ret = my_modf(x0-l*f, &i2);
00641                                 (*iptr) = l*f + i2;
00642                                 return ret;
00643                         } 
00644 
00645                         (*iptr) = l;
00646                         return x - (*iptr);
00647                 }
00648                 x *= 0.1;
00649                 f *= 10.0;
00650         }
00651 
00652         /* yikes! the number is beyond what we can handle. What do we do? */
00653         (*iptr) = 0;
00654         return 0;
00655 }

int rsync_vsnprintf ( char *  str,
size_t  count,
const char *  fmt,
va_list  args 
)

snprintf.c818 行で定義されています。

参照先 dopr().

00819 {
00820         return dopr(str, count, fmt, args);
00821 }

int rsync_snprintf ( char *  str,
size_t  count,
const char *  fmt,
  ... 
)

snprintf.c832 行で定義されています。

参照先 vsnprintf().

00833 {
00834         size_t ret;
00835         va_list ap;
00836     
00837         va_start(ap, fmt);
00838         ret = vsnprintf(str, count, fmt, ap);
00839         va_end(ap);
00840         return ret;
00841 }

int vasprintf ( char **  ptr,
const char *  format,
va_list  ap 
)

snprintf.c848 行で定義されています。

参照先 vsnprintf().

参照元 asprintf().

00849 {
00850         int ret;
00851         va_list ap2;
00852 
00853         VA_COPY(ap2, ap);
00854         
00855         ret = vsnprintf(NULL, 0, format, ap2);
00856         if (ret <= 0) return ret;
00857 
00858         (*ptr) = (char *)malloc(ret+1);
00859         if (!*ptr) return -1;
00860 
00861         VA_COPY(ap2, ap);
00862 
00863         ret = vsnprintf(*ptr, ret+1, format, ap2);
00864 
00865         return ret;
00866 }

int asprintf ( char **  ptr,
const char *  format,
  ... 
)

snprintf.c871 行で定義されています。

参照先 vasprintf().

参照元 _Insure_trap_error()add_rule()finish_pre_exec()full_fname()glob_expand()open_socket_in()rsync_module()server_options().

00872 {
00873         va_list ap;
00874         int ret;
00875         
00876         *ptr = NULL;
00877         va_start(ap, format);
00878         ret = vasprintf(ptr, format, ap);
00879         va_end(ap);
00880 
00881         return ret;
00882 }

int sprintf ( char *  str,
const char *  fmt,
  ... 
)

参照元 human_num()inet_ntop4()is_in_group()list_file()main()output_flist()robust_unlink()rsync_panic_handler().

int main ( void   ) 

snprintf.c889 行で定義されています。

参照先 snprintf()sprintf().

00890 {
00891         char buf1[1024];
00892         char buf2[1024];
00893         char *fp_fmt[] = {
00894                 "%1.1f",
00895                 "%-1.5f",
00896                 "%1.5f",
00897                 "%123.9f",
00898                 "%10.5f",
00899                 "% 10.5f",
00900                 "%+22.9f",
00901                 "%+4.9f",
00902                 "%01.3f",
00903                 "%4f",
00904                 "%3.1f",
00905                 "%3.2f",
00906                 "%.0f",
00907                 "%f",
00908                 "-16.16f",
00909                 NULL
00910         };
00911         double fp_nums[] = { 6442452944.1234, -1.5, 134.21, 91340.2, 341.1234, 203.9, 0.96, 0.996, 
00912                              0.9996, 1.996, 4.136, 5.030201, 0.00205,
00913                              /* END LIST */ 0};
00914         char *int_fmt[] = {
00915                 "%-1.5d",
00916                 "%1.5d",
00917                 "%123.9d",
00918                 "%5.5d",
00919                 "%10.5d",
00920                 "% 10.5d",
00921                 "%+22.33d",
00922                 "%01.3d",
00923                 "%4d",
00924                 "%d",
00925                 NULL
00926         };
00927         long int_nums[] = { -1, 134, 91340, 341, 0203, 0};
00928         char *str_fmt[] = {
00929                 "10.5s",
00930                 "5.10s",
00931                 "10.1s",
00932                 "0.10s",
00933                 "10.0s",
00934                 "1.10s",
00935                 "%s",
00936                 "%.1s",
00937                 "%.10s",
00938                 "%10s",
00939                 NULL
00940         };
00941         char *str_vals[] = {"hello", "a", "", "a longer string", NULL};
00942         int x, y;
00943         int fail = 0;
00944         int num = 0;
00945 
00946         printf ("Testing snprintf format codes against system sprintf...\n");
00947 
00948         for (x = 0; fp_fmt[x] ; x++) {
00949                 for (y = 0; fp_nums[y] != 0 ; y++) {
00950                         int l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]);
00951                         int l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]);
00952                         sprintf (buf2, fp_fmt[x], fp_nums[y]);
00953                         if (strcmp (buf1, buf2)) {
00954                                 printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", 
00955                                        fp_fmt[x], buf1, buf2);
00956                                 fail++;
00957                         }
00958                         if (l1 != l2) {
00959                                 printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, fp_fmt[x]);
00960                                 fail++;
00961                         }
00962                         num++;
00963                 }
00964         }
00965 
00966         for (x = 0; int_fmt[x] ; x++) {
00967                 for (y = 0; int_nums[y] != 0 ; y++) {
00968                         int l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]);
00969                         int l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]);
00970                         sprintf (buf2, int_fmt[x], int_nums[y]);
00971                         if (strcmp (buf1, buf2)) {
00972                                 printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", 
00973                                        int_fmt[x], buf1, buf2);
00974                                 fail++;
00975                         }
00976                         if (l1 != l2) {
00977                                 printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, int_fmt[x]);
00978                                 fail++;
00979                         }
00980                         num++;
00981                 }
00982         }
00983 
00984         for (x = 0; str_fmt[x] ; x++) {
00985                 for (y = 0; str_vals[y] != 0 ; y++) {
00986                         int l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]);
00987                         int l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]);
00988                         sprintf (buf2, str_fmt[x], str_vals[y]);
00989                         if (strcmp (buf1, buf2)) {
00990                                 printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", 
00991                                        str_fmt[x], buf1, buf2);
00992                                 fail++;
00993                         }
00994                         if (l1 != l2) {
00995                                 printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, str_fmt[x]);
00996                                 fail++;
00997                         }
00998                         num++;
00999                 }
01000         }
01001 
01002         printf ("%d tests failed out of %d.\n", fail, num);
01003 
01004         printf("seeing how many digits we support\n");
01005         {
01006                 double v0 = 0.12345678901234567890123456789012345678901;
01007                 for (x=0; x<100; x++) {
01008                         double p = pow(10, x); 
01009                         double r = v0*p;
01010                         snprintf(buf1, sizeof(buf1), "%1.1f", r);
01011                         sprintf(buf2,                "%1.1f", r);
01012                         if (strcmp(buf1, buf2)) {
01013                                 printf("we seem to support %d digits\n", x-1);
01014                                 break;
01015                         }
01016                 }
01017         }
01018 
01019         return 0;
01020 }


rsyncに対してSat Dec 5 19:45:45 2009に生成されました。  doxygen 1.4.7