contra/source/main.cpp
2024-06-19 13:01:30 +02:00

97 lines
1.9 KiB
C++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <libgen.h>
#include <vector>
#include <string>
#include "cli.hpp"
#include "scanner.hpp"
#include "exit_values.hpp"
// Define declared variables from 'scanner.hpp' here
std::vector<std::string> ignore_list;
std::vector<std::string> asymmetric_special_list;
bool is_asymmetric;
std::string buffer;
std::string tag_candidate;
std::stack<std::string> tag_stack;
/* --------------- */
extern int from_xml_to_csml_lex_destroy(void);
extern int from_csml_to_xml_lex_destroy(void);
char * output_name_from_input_name(const char * const input, const char * const extension) {
char * input_duplicate = strdup(input);
char * dn = strdup(dirname(input_duplicate));
char * bn = strdup(basename(input_duplicate));
free(input_duplicate);
char * r = (char *)malloc(strlen(dn) + strlen(bn) + strlen(extension));
strcpy(r, dn);
strcat(r, bn);
const char *last_dot = strrchr(bn, '.');
if (last_dot) {
strncpy(r, bn, last_dot - bn);
} else {
strcpy(r, bn);
}
strcat(r, extension);
free(dn);
free(bn);
return r;
}
void trim(char * const s) {
int bp = 0;
int len = strlen(s);
bool do_break = false;
for (int i = 0; i < len; i++) {
if ((s[i] >= 'A' && s[i] <= 'Z')
|| (s[i] >= 'a' && s[i] <= 'z')
|| (s[i] >= '0' && s[i] <= '9')
|| (s[i] == '_')) {
s[bp++] = s[i];
do_break = true;
} else if (do_break) {
break;
}
}
s[bp] = '\0';
}
void trim(std::string &s) {
char * dup = strdup(s.c_str());
trim(dup);
s = std::string(dup);
free(dup);
}
signed main(int argc, char * * argv) {
const int b = parse_round1_arguments(argc, argv);
switch (b) {
case 0: break;
case EXIT_EARLY_SUCCESS: exit(EXIT_SUCCESS);
default: exit(b);
}
parse_round2_arguments(argc - 1, argv + 1);
if (not did_any_work) {
usage();
}
from_xml_to_csml_lex_destroy();
from_csml_to_xml_lex_destroy();
return EXIT_SUCCESS;
}