Files
CS-LABS/mine/lab_2/main_dynamic.c
2025-12-10 16:50:28 +07:00

46 lines
1.5 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#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 <input.txt> <output.txt> <max_replacements> <libpath>\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;
}