Custom printf function
- Used editors:
vi
,vim
- All files will compiled on Ubuntu 20.04 LTS using gcc, using the options
-Wall -Werror -Wextra -pedantic -std=gnu89
- All files end with a new line
- Code for custom printf uses the
Betty
style. Checked using betty-style.pl and betty-doc.pl - No global variables used
- No more than 5 functions per file
- The prototypes of all your functions are included in header file called main.h
- All header files are include guarded
write
(man 2 write)malloc
(man 3 malloc)free
(man 3 free)va_start
(man 3 va_start)va_end
(man 3 va_end)va_copy
(man 3 va_copy)va_arg
(man 3 va_arg)
$ gcc -Wall -Werror -Wextra -pedantic -std=gnu89 *.c
Write a function that produces output according to a format.
- Prototype: int _printf(const char *format, ...);
- Returns: the number of characters printed (excluding the null byte used to end output to strings)
- write output to stdout, the standard output stream
- format is a character string. The format string is composed of zero or more directives. See man 3 printf for more detail. You need to handle the following conversion specifiers:
- You don’t have to reproduce the buffer handling of the C library printf function
- You don’t have to handle the flag characters
- You don’t have to handle field width
- You don’t have to handle precision
- You don’t have to handle the length modifiers
Handle the following conversion specifiers:
-
You don’t have to handle the flag characters
-
You don’t have to handle field width
-
You don’t have to handle precision
-
You don’t have to handle the length modifiers
Handle the following custom conversion specifiers:
- b: the unsigned int argument is converted to binary
Handle the following conversion specifiers:
-
u:
-
o:
-
x:
-
X:
-
You don’t have to handle the flag characters
-
You don’t have to handle field width
-
You don’t have to handle precision
-
You don’t have to handle the length modifiers
Use a local buffer of 1024 chars in order to call write as little as possible.
Handle the following custom conversion specifier:
- S : prints the string. Print_String
- Non printable characters (0 < ASCII value < 32 or >= 127) are printed this way: \x, followed by the ASCII code value in hexadecimal (upper case - always 2 characters)
Handle the following conversion specifier: p.
- You don’t have to handle the flag characters
- You don’t have to handle field width
- You don’t have to handle precision
- You don’t have to handle the length modifiers
Handle the following flag characters for non-custom conversion specifiers:
Handle the following length modifiers for non-custom conversion specifiers:
Handle the field width for non-custom conversion specifiers.
Handle the precision for non-custom conversion specifiers.
Handle the 0 flag character for non-custom conversion specifiers.
Handle the - flag character for non-custom conversion specifiers.
Handle the following custom conversion specifier:
- r : prints the reversed string.
Handle the following custom conversion specifier:
- R: prints the rot13'ed string
All the above options work well together.
-
The function takes a format string and a variable number of arguments.
-
It initialises variables including an integer i, printed, printed_chars, flags, width, precision, size, buff_ind, a char buffer with a size of BUFF_SIZE and a va_list named list
-
The function checks if the format string is NULL and returns -1 if it is.
-
It initialises the variable argument list and sets the buffer index to 0 and the printed characters to 0.
-
The function iterates through the format string, for each iteration it checks if the current character is not '%'
-
If the current character is not '%', it adds the character to the buffer and increments the buffer index by 1.
-
If the buffer index reaches the size of the buffer, it calls the print_buffer function to print the buffer.
-
If the current character is "%", it calls the helper functions get_flags, get_width, get_precision, get_size and handle_print to process the formatting
-
It prints the output to the buffer and increments the printed_chars by the number of characters printed.
-
At the end of the iteration; it calls the print_buffer function to print whatever is left in the buffer.
-
The function ends the variable argument list and returns the total number of characters printed.
- Yasmine Ben Ali
- Samuel Selasi