int my_printf(int fd, char *str, ...) { va_list ap; t_fonct *tab; t_print pri; pri.fd = fd; tab = NULL; tab = init_struct(tab); pri.i = 0; if (str == NULL || tab == NULL) return (-1); va_start(ap, str); while (pri.i < my_strlen(str)) { if (str[pri.i] == '%') pri.i = print_fct(ap, tab, str, pri); else my_putchar_in(fd, str[pri.i]); pri.i++; } va_end(ap); free(tab); return (0); }
int main(int, char **av) { static const std::string cmd_tab[CMD_NB] = {"run", "quit", "break", "delete", "print", "printreg", "setreg", "help", "next", "printaddr"}; if (!av[1]) { std::cout << USAGE << std::endl; return (-1); } if ((file_fd = ::open(av[1], O_RDONLY, 0644)) == -1) { std::cerr << EOPENFILE << std::endl; return (-1); } _child_pid = run_and_pause(av[1]); std::cout << PROMPT << std::flush; for (std::string tmp;;) { struct timeval tv; fd_set set; int32_t rv; int32_t status; FD_ZERO(&set); FD_SET(0, &set); tv.tv_sec = 0; tv.tv_usec = 700; rv = ::select(1, &set, 0, 0, &tv); if (rv == -1) { break ; } else if (rv == 0) { waitpid(_child_pid, &status, WNOHANG); if (WIFSTOPPED(status) && WSTOPSIG(status) == 5) { check_for_breakpoint(_child_pid); } } else { if (not std::getline(std::cin, tmp)) { break ; } } if (tmp.empty()) continue ; unsigned long a, i = tmp.find(" "); std::string cmd = tmp.substr(0, i == std::string::npos ? tmp.size() : i); for (a = 0;a < CMD_NB;++a) if (!cmd.compare(cmd_tab[a])) break ; switch (a) { case RUN_CMD: run_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case QUIT_CMD: goto exit_label; case BREAK_CMD: break_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case DELETE_CMD: delete_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case PRINT_CMD: print_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case PRINTREG_CMD: printreg_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case SETREG_CMD: setreg_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case HELP_CMD: std::cout << HELP << std::endl; std::cout << PROMPT << std::flush; tmp.clear(); break ; case NEXT_CMD: next_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; case PRINTADDR_CMD: printaddr_fct(tmp); std::cout << PROMPT << std::flush; tmp.clear(); break ; default: std::cerr << CNF << std::endl; std::cout << PROMPT << std::flush; tmp.clear(); break ; } } exit_label: std::cout << std::endl; (void)::kill(_child_pid, SIGTERM); return (::close(file_fd)); }