#include #include #include #include #define MAX_LINE 4096 typedef int (*replace_func_t)(char*, int, int*); int main(int argc, char *argv[]) { if (argc != 5) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } FILE *fin = fopen(argv[1], "r"); if (!fin) { perror("fopen input"); return 1; } FILE *fout = fopen(argv[2], "w"); if (!fout) { perror("fopen output"); fclose(fin); return 1; } int cap = atoi(argv[3]); if (cap < 0) { fprintf(stderr, "invalid cap\n"); fclose(fin); fclose(fout); return 1; } void *lib = dlopen(argv[4], RTLD_LAZY); if (!lib) { fprintf(stderr, "dlopen error: %s\n", dlerror()); fclose(fin); fclose(fout); return 1; } replace_func_t replace = (replace_func_t) dlsym(lib, "replace_char_line"); if (!replace) { fprintf(stderr, "dlsym error: %s\n", dlerror()); fclose(fin); fclose(fout); dlclose(lib); return 1; } int total = 0; char line[MAX_LINE]; while (fgets(line, sizeof(line), fin)) { if (line[0] == '\0' || line[0] == '\n') { fputs(line, fout); continue; } int key = (unsigned char)line[0]; if (cap > 0) { int repl_line = replace(line, key, &cap); total += repl_line; } fputc(line[0], fout); fputs(line + 1, fout); } fclose(fin); fclose(fout); dlclose(lib); printf("total_replacements: %d\n", total); return 0; }