Skip to content

Instantly share code, notes, and snippets.

@NilsIrl
Created January 18, 2020 13:13
Show Gist options
  • Save NilsIrl/6275ce1e862a7835e6632e9e561070ba to your computer and use it in GitHub Desktop.
Save NilsIrl/6275ce1e862a7835e6632e9e561070ba to your computer and use it in GitHub Desktop.
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
void fdprintf(int fd, const char *fmt, ...)
{
/* Guess we need no more than 100 bytes. */
int n, size = 100;
char *p, *np;
va_list ap;
if (fd < 0)
return;
if ((p = (char *)malloc(size)) == NULL)
return;
while (1)
{
/* Try to print in the allocated space. */
va_start(ap, fmt);
n = vsnprintf(p, size, fmt, ap);
va_end(ap);
/* If that worked, return the string. */
if (n > -1 && n < size)
{
write(fd, p, n);
free(p);
return;
}
/* Else try again with more space. */
if (n > -1) /* glibc 2.1 */
size = n + 1; /* precisely what is needed */
else /* glibc 2.0 */
size *= 2; /* twice the old size */
if ((np = (char *)realloc(p, size)) == NULL)
{
free(p);
return;
}
else
{
p = np;
}
}
}
int new_fdprintf(int fd, const char *fmt, ...)
{
FILE *file;
if ((file = fdopen(dup(fd), "w")) == NULL)
{
return -1;
}
va_list ap;
va_start(ap, fmt);
int ret = vfprintf(file, fmt, ap);
fclose(file);
va_end(ap);
return ret;
}
int main(int argc, char *argv[])
{
int age = atoi(argv[2]);
int fd = open(argv[3], O_WRONLY | O_CREAT);
if (fd == -1)
exit(-1);
clock_t start_time = clock();
if (start_time == -1)
exit(-1);
for (int i = 0; i < 1000; ++i)
{
new_fdprintf(fd, "hi %s how are you?\n did you know your are %d year old?????aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", argv[1], age);
}
clock_t end_time = clock();
if (end_time == -1)
exit(-1);
printf("new_fdprintf: %d\n", end_time - start_time);
start_time = clock();
if (start_time == -1)
exit(-1);
for (int i = 0; i < 1000; ++i)
{
fdprintf(fd, "hi %s how are you?\n did you know your are %d year old?????aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", argv[1], age);
}
end_time = clock();
if (end_time == -1)
exit(-1);
printf("old_fdprintf: %d\n", end_time - start_time);
start_time = clock();
if (start_time == -1)
exit(-1);
for (int i = 0; i < 1000; ++i)
{
dprintf(fd, "hi %s how are you?\n did you know your are %d year old?????aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", argv[1], age);
}
end_time = clock();
if (end_time == -1)
exit(-1);
printf("dprintf: %d\n", end_time - start_time);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment