diff --git a/myprintf.c b/myprintf.c --- a/myprintf.c +++ b/myprintf.c @@ -8,17 +8,23 @@ #include #include +#define BUF_SIZE 1024 + int myprintf (char *fmt, ...) { - int i, pos = 0; + int i, value, pos = 0, size = 1; + char c; + + char *ptr; + char *s; + char *s_str; + char v_str[28]; + va_list list; - char c; - char *s; - char s_str[1024]; - - char v[12]; - int value; + if ((s_str = malloc (BUF_SIZE)) == NULL) { + return EOF; + } va_start (list, fmt); @@ -29,35 +35,54 @@ case 'c': c = va_arg (list, int); s_str[pos++] = c; - c = *fmt++; break; + case 's': s = va_arg (list, char *); + while ((pos + strlen (s)) > (size * BUF_SIZE)) { + if ((ptr = realloc (s_str, ++size * BUF_SIZE)) == NULL) { + s_str[pos] = '\0'; + fputs (s_str, stdout); /* print it anyway... */ + return EOF; + } + s_str = ptr; + } for (i = 0; i < strlen (s); i++) { s_str[pos++] = s[i]; } - c = *fmt++; break; + case 'd': value = va_arg (list, int); - sprintf (v, "%d", value); - for (i = 0; i < strlen (v); i++) { - s_str[pos++] = v[i]; + sprintf (v_str, "%d", value); + for (i = 0; i < strlen (v_str); i++) { + s_str[pos++] = v_str[i]; } - c = *fmt++; break; + default: - puts ("Unknown character"); + s_str[pos++] = *fmt; } + + c = *fmt++; default: s_str[pos++] = *fmt++; } + + if (pos > (size * BUF_SIZE / 2)) { + if ((ptr = realloc (s_str, ++size * BUF_SIZE)) == NULL) { + return EOF; + } + s_str = ptr; + } + va_end (list); } s_str[pos] = '\0'; + fputs (s_str, stdout); + free (s_str); - puts (s_str); return pos; } @@ -65,6 +90,7 @@ { int len; - len = myprintf ("Bugfix needed: %s\t[%d:%d]", "Lines", 20, 30); + len = myprintf ("Printf replacement %% [Version %d - %s]...\n", 5, "LSF Rostock"); + return EXIT_SUCCESS; }