… | |
… | |
517 | } |
517 | } |
518 | else |
518 | else |
519 | memcpy (dst, src, len + 1); |
519 | memcpy (dst, src, len + 1); |
520 | } |
520 | } |
521 | |
521 | |
522 | const std::string |
522 | const char * |
523 | format (const char *format, ...) |
523 | format (const char *format, ...) |
524 | { |
524 | { |
525 | int len; |
525 | static dynbuf_text buf; |
526 | |
526 | |
527 | { |
527 | buf.clear (); |
528 | char buf[128]; |
|
|
529 | |
528 | |
530 | va_list ap; |
529 | va_list ap; |
531 | va_start (ap, format); |
530 | va_start (ap, format); |
532 | len = vsnprintf (buf, sizeof (buf), format, ap); |
531 | buf.vprintf (format, ap); |
533 | va_end (ap); |
532 | va_end (ap); |
534 | |
533 | |
535 | assert (len >= 0); // shield againstz broken vsnprintf's |
|
|
536 | |
|
|
537 | // was our static buffer short enough? |
|
|
538 | if (len < sizeof (buf)) |
|
|
539 | return std::string (buf, len); |
|
|
540 | } |
|
|
541 | |
|
|
542 | { |
|
|
543 | // longer, try harder |
|
|
544 | char *buf = salloc<char> (len + 1); |
|
|
545 | |
|
|
546 | va_list ap; |
|
|
547 | va_start (ap, format); |
|
|
548 | vsnprintf (buf, len + 1, format, ap); |
|
|
549 | va_end (ap); |
|
|
550 | |
|
|
551 | const std::string s (buf, len); |
|
|
552 | sfree<char> (buf, len + 1); |
|
|
553 | |
|
|
554 | return buf; |
534 | return buf; |
555 | } |
|
|
556 | } |
535 | } |
557 | |
536 | |
558 | tstamp now () |
537 | tstamp now () |
559 | { |
538 | { |
560 | struct timeval tv; |
539 | struct timeval tv; |