#include // printf #include // stdarg() #include // strlen, strcat osv #include // malloc void leggtil_streng(char **, const char *); void leggtil_char(char **, char); int leggtil_int(char **, int, int); int leggtil_hex(char **, int, int); void myprintf(char *streng, ...) { va_list ap; char *ut_tekst; char tegn; char *tekst; int tall; char *plassering; // initialisere ut_tekst, og feilsjekke ut_tekst = malloc(sizeof(char) * 2); if ( ut_tekst == NULL ) { printf("malloc feilet!\n"); exit(1); } ut_tekst[0] = 0; plassering = ut_tekst; va_start(ap, streng); #ifdef DEBUG printf("Original tekst:\n"); #endif // gå gjennom strengen helt til // man finner NULL termineringen while(*streng) { // dersom man støter på et % // øker man pekeren med 1 // for å finne tegnet. // if ( plassering != ut_tekst ) { // printf("ut_streng flyttet\n"); // } if( *streng == '%' ) { streng++; switch(*streng) { // føye til en tekst streng case 's': tekst = va_arg(ap, char *); // hente argumentet #ifdef DEBUG printf("%s", tekst); #endif leggtil_streng(&ut_tekst, tekst); break; // føye til et tall case 'd': tall = va_arg(ap, int); // hente argument #ifdef DEBUG printf("%d", tall); #endif if ( tall < 0 ) { leggtil_char(&ut_tekst, '-'); tall = tall * (-1); } leggtil_int(&ut_tekst, tall, 1); break; // føye til et tall i hex case 'x': tall = va_arg(ap, int); // hente inn tallet if ( tall < 0 ) { leggtil_char(&ut_tekst, '-'); tall = tall * (-1); } #ifdef DEBUG printf("%x", tall); #endif leggtil_hex(&ut_tekst, tall, 1); break; // føye til et vanlig tegn case 'c': tegn = (char)va_arg(ap, int); // hente inn argumentet #ifdef DEBUG printf("%c", tegn); #endif leggtil_char(&ut_tekst, tegn); // legge til tegnet break; }//switch }//if // vanlig tegn else { #ifdef DEBUG printf("%c", *streng); #endif leggtil_char(&ut_tekst, *streng); } streng++; } va_end(ap); #ifdef DEBUG printf("\nmyprintf tekst:\n"); #endif fprintf(stdout, "%s", ut_tekst); free(ut_tekst); } /* append char */ void leggtil_char(char **ut_streng, char leggtil) { int lengde = strlen(*ut_streng); if ( (*ut_streng = realloc(*ut_streng, (lengde * sizeof(char)) + sizeof(char) * 2)) == NULL) { printf("realloc failed\n"); exit(1); } if ( *ut_streng == NULL ) { printf("leggtil_char(): realloc feilet!\n"); exit(1); } (*ut_streng)[lengde] = leggtil; (*ut_streng)[lengde + 1] = '\0'; } /* append string */ void leggtil_streng(char **ut_tekst, const char *legg_til) { *ut_tekst = realloc(*ut_tekst, strlen(*ut_tekst) + strlen(legg_til) + 1); if ( *ut_tekst == NULL ) { printf("leggtil_streng realloc feilet!\n"); exit(2); } strcat(*ut_tekst, legg_til); } /* dec -> ascii appends recursive */ int leggtil_int(char **a, int verdi, int sum) { int tmp = verdi; int antall = 0; char svada; if ( verdi > sum && verdi > sum * 10) { tmp = leggtil_int(a, verdi, sum * 10); } while( tmp >= sum ) { tmp -= sum; antall++; } svada= (char)antall + 48; leggtil_char(a, svada); return tmp; } /* hex -> ascii appends recursive */ int leggtil_hex(char **a, int verdi, int sum) { int tmp = verdi; int antall = 0; char leggtil; if ( verdi > sum && verdi > sum * 16 ) { tmp = leggtil_hex(a, verdi, sum * 16); } while( tmp >= sum ) { tmp -= sum; antall++; } if ( antall > 9 ) { antall += 39; } leggtil = (char) antall + 48; leggtil_char(a, leggtil); return tmp; } /* Selve driver programmet for myprintf() funksjonen */ int main() { char streng[] = { "Sjekke streng"}; char tegn = 'F'; int tall = 1234; // 0x4d2 int loop; for(loop = 0; loop < 6; loop++) myprintf("test %c %c %d %d %x %x %s %s\n", tegn, 'F', tall, 1234, tall, 1234, streng, "Sjekke streng"); myprintf("test %c %c %d %d %x %x %s %s\n", tegn, 'F', tall, 1234, tall, 1234, streng, "SJekke streng"); return 0; }