void HuffmanConverter::decode_file(const char *inFile, const char *outFile) { // read from table and build frequency tree // build prefix tree // read .huf file and get bit string during reaching to leaf node of prefix tree // At each bit string, map it to one character in inverted encode table // Nessasary : .huf .tab if (inFile == nullptr) { std::cerr << "Input file name is missing!\n"; return; } std::string tpath = format_path_name(path_freq, inFile, postfix_tab); // table file's path std::string hpath = format_path_name(path_encoded, inFile, postfix_huf); // input file's path std::string dpath = std::string(path_decoded).append(inFile); // output file's path std::ifstream hufFile(hpath, std::ios::binary); std::ifstream tabFile(tpath); std::ofstream deFile(dpath); /*std::cout << tpath << "\n"; std::cout << hpath << "\n"; std::cout << dpath << "\n";*/ if (!tabFile.is_open()) { std::cerr << "tab file doesn't exist" << std::endl; return; } if (!hufFile.is_open()) { std::cerr << "target file doesn't exist" << std::endl; return; } // empty fTab.clear(); eTab.clear(); unsigned last_pos = parse_freq_table(tabFile); build_prefix_tree(); encode_symbol(); // read all binaries into memory unsigned long long before_sz = get_file_size(hpath); char *buf = new char[before_sz]; hufFile.read(buf, before_sz); std::string bit_string = ""; build_bit_string(buf, before_sz, bit_string, last_pos); //std::cout << parse_bitstr(bit_string); deFile << parse_bitstr(bit_string); unsigned long long after_sz = get_file_size(dpath); tabFile.close(); hufFile.close(); printf("%-20s : %s\n", "File Name", inFile); printf("%-20s : %llu\n", "File Size", before_sz); printf("%-20s : %s\n", "Table Name", tpath.c_str()); printf("%-20s : %s\n", "Decoded Location", path_decoded); printf("%-20s : %llu -> %llu\n","Size Change(bytes)", before_sz, after_sz); double unzip_rate = 100.0 + ((double)after_sz/before_sz)*100.0; printf("%-20s : %-4.2f%%\n","Decompression Rate", unzip_rate); }
/* hspell_init() reads the dictionary and initializes the necessary data structures, into the an allocated dictp structure. hspell_init() returns 0 on success, or negative numbers on errors: -1: cannot read dictionary. */ int hspell_init(struct dict_radix **dictp, int flags){ int ret; ret=load_data(dictp); if(ret<0) return ret; build_prefix_tree(flags & HSPELL_OPT_HE_SHEELA); #ifdef USE_LINGINFO if (flags & HSPELL_OPT_LINGUISTICS) { if (!linginfo_init(hspell_dictionary)) return -1; } #endif return 0; }
END_TEST START_TEST(test_build_radix) { statsite_config config; int res = config_from_filename(NULL, &config); histogram_config c1 = {"foo", 100, 200, 10, 0, NULL, 0}; histogram_config c2 = {"bar", 100, 200, 10, 0, NULL, 0}; histogram_config c3 = {"baz", 100, 200, 10, 0, NULL, 0}; config.hist_configs = &c1; c1.next = &c2; c2.next = &c3; fail_unless(build_prefix_tree(&config) == 0); fail_unless(config.histograms != NULL); histogram_config *conf = NULL; fail_unless(radix_search(config.histograms, "baz", (void**)&conf) == 0); fail_unless(conf == &c3); }
int main(int argc, char **argv) { // Initialize syslog setup_syslog(); // Parse the command line char *config_file = NULL; int parse_res = parse_cmd_line_args(argc, argv, &config_file); if (parse_res) return 1; // Parse the config file statsite_config *config = calloc(1, sizeof(statsite_config)); int config_res = config_from_filename(config_file, config); if (config_res != 0) { syslog(LOG_ERR, "Failed to read the configuration file!"); return 1; } // Validate the config file if (validate_config(config)) { syslog(LOG_ERR, "Invalid configuration!"); return 1; } // Set prefixes for each message type if (prepare_prefixes(config)) { syslog(LOG_ERR, "Failed to get prefixes!"); return 1; } // Build the prefix tree if (build_prefix_tree(config)) { syslog(LOG_ERR, "Failed to build prefix tree!"); return 1; } // Set the syslog mask setlogmask(config->syslog_log_level); // Daemonize if (config->daemonize) { pid_t pid, sid; int fd; syslog(LOG_INFO, "Daemonizing."); pid = fork(); // Exit if we failed to fork if (pid < 0) { syslog(LOG_ERR, "Failed to fork() daemon!"); return 1; } // Parent process returns if (pid) return 0; // Create a new session sid = setsid(); if (sid < 0) { syslog(LOG_ERR, "Failed to set daemon SID!"); return 1; } int write_pidfile_res = write_pidfile(config->pid_file, sid); if (write_pidfile_res) { syslog(LOG_ERR, "Failed to write pidfile. Terminating."); return 1; } if ((fd = open("/dev/null", O_RDWR, 0)) != -1) { dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if (fd > STDERR_FILENO) close(fd); } } // Log that we are starting up syslog(LOG_INFO, "Starting statsite."); // Initialize the networking statsite_networking *netconf = NULL; int net_res = init_networking(config, &netconf); if (net_res != 0) { syslog(LOG_ERR, "Failed to initialize networking!"); return 1; } // Setup signal handlers signal(SIGPIPE, SIG_IGN); // Ignore SIG_IGN signal(SIGHUP, SIG_IGN); // Ignore SIG_IGN signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); // Join the networking loop, blocks until exit enter_networking_loop(netconf, &SHOULD_RUN); // Begin the shutdown/cleanup shutdown_networking(netconf); // Do the final flush final_flush(); // If daemonized, remove the pid file if (config->daemonize && unlink(config->pid_file)) { syslog(LOG_ERR, "Failed to delete pid file!"); } // Free our memory free(config); // Done return 0; }
int main(int argc, char **argv) { // temporarily set the syslog facilty to main and init it setup_syslog(LOG_USER, 0); // Parse the command line char *config_file = NULL; int parse_res = parse_cmd_line_args(argc, argv, &config_file); if (parse_res) return 1; // Parse the config file statsite_config *config = alloc_config(); int config_res = config_from_filename(config_file, config); if (config_res != 0) { syslog(LOG_ERR, "Failed to read the configuration file!"); return 1; } // Validate the config file if (validate_config(config)) { syslog(LOG_ERR, "Invalid configuration!"); return 1; } // close the initial syslog closelog(); // Initialize syslog with configured facility setup_syslog(config->syslog_log_facility, config->daemonize); // Set prefixes for each message type if (prepare_prefixes(config)) { syslog(LOG_ERR, "Failed to get prefixes!"); return 1; } // Build the prefix tree if (build_prefix_tree(config)) { syslog(LOG_ERR, "Failed to build prefix tree!"); return 1; } // Set the syslog mask setlogmask(config->syslog_log_level); // Initialize libcurl curl_global_init(CURL_GLOBAL_DEFAULT); // Daemonize if (config->daemonize) { pid_t pid, sid; int fd; syslog(LOG_INFO, "Daemonizing."); pid = fork(); // Exit if we failed to fork if (pid < 0) { syslog(LOG_ERR, "Failed to fork() daemon!"); return 1; } // Parent process returns if (pid) return 0; // Create a new session sid = setsid(); if (sid < 0) { syslog(LOG_ERR, "Failed to set daemon SID!"); return 1; } int write_pidfile_res = write_pidfile(config->pid_file, sid); if (write_pidfile_res) { syslog(LOG_ERR, "Failed to write pidfile. Terminating."); return 1; } if ((fd = open("/dev/null", O_RDWR, 0)) != -1) { dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if (fd > STDERR_FILENO) close(fd); } } // Log that we are starting up syslog(LOG_INFO, "Starting statsite."); // Build the sinks sink* sinks = NULL; init_sinks(&sinks, config); // Initialize the networking statsite_networking *netconf = NULL; int net_res = init_networking(config, &netconf, sinks); if (net_res != 0) { syslog(LOG_ERR, "Failed to initialize networking!"); return 1; } // Setup signal handlers signal(SIGPIPE, SIG_IGN); // Ignore SIG_IGN signal(SIGHUP, SIG_IGN); // Ignore SIG_IGN signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); // Join the networking loop, blocks until exit enter_networking_loop(netconf, &SIGNUM); if (SIGNUM != 0) { syslog(LOG_WARNING, "Received signal [%s]! Exiting...", strsignal(SIGNUM)); } // Begin the shutdown/cleanup shutdown_networking(netconf); // Do the final flush final_flush(sinks); // If daemonized, remove the pid file if (config->daemonize && unlink(config->pid_file)) { syslog(LOG_ERR, "Failed to delete pid file!"); } // Free our memory free_config(config); // Tear down libcurl curl_global_cleanup(); // Done return 0; }