Hello, everyone. I'm a self-taught C programmer and I'm trying to learn to write code as professionally as possible. This program works, but could you give me a rating as to how well-written it is? TIA.
Code:
/* Replace one string with another in copying stdin to stdout. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void
clear(char *sz_buffer, size_t bufsize, unsigned int *ui_bufpos)
{
*ui_bufpos = 0;
(void) memset(sz_buffer, 0, bufsize);
}
void
output_error(void)
{
(void) fprintf(stderr, "Error: Couldn't put character to stdout.\n");
exit(EXIT_FAILURE);
}
void
print_string(const char *s)
{
if (printf("%s", s) < 0)
output_error();
}
void
print_char(const char c)
{
if (EOF == putchar(c))
output_error();
}
int main(int argc, char *argv[])
{
int c = EOF;
size_t buffer_size = 0;
char *sz_buffer = NULL;
unsigned int ui_bufpos = 0;
if (argc != 3)
{
(void) fprintf(stderr, "Usage : %s before after\n",
(argv[0]) ? argv[0] : "replace");
exit(EXIT_FAILURE);
}
buffer_size = strlen(argv[1]) + 1; /* for the terminating \0 */
sz_buffer = malloc(buffer_size);
if (NULL == sz_buffer)
{
(void) fprintf(stderr, "Error: Out of memory.\n");
exit(EXIT_FAILURE);
}
clear(sz_buffer, buffer_size, &ui_bufpos);
while ((c = getchar()) != EOF)
{
if (ui_bufpos < buffer_size - 1)
{
sz_buffer[ui_bufpos++] = c;
}
else
{
print_char(sz_buffer[0]);
(void) memmove(sz_buffer, sz_buffer + 1, buffer_size - 2);
sz_buffer[buffer_size - 2] = c;
}
if ( (ui_bufpos == buffer_size - 1) &&
(0 == strcmp(sz_buffer, argv[1])) )
{
print_string(argv[2]);
clear(sz_buffer, buffer_size, &ui_bufpos);
}
}
print_string(sz_buffer);
free(sz_buffer);
return EXIT_SUCCESS;
}