int main(int iArgc, char *pArgv[]) { // Perform argument processing. if (iArgc == 1) { SetupScanner(NULL, NULL); } else if (iArgc != 3 || strcmp(pArgv[1], "-h") == 0 || strcmp(pArgv[1], "--help") == 0) { printf("Usage: encode <animation-file> <output-file>\n"); exit(1); } FILE *pInfile = fopen(pArgv[1], "r"); SetupScanner(pArgv[1], pInfile); // Parse input file. int iRet = yyparse(); if (pInfile != NULL) fclose(pInfile); if (iRet != 0) { exit(iRet); } // Check input, generate output. Check(); Encode(pArgv[2]); exit(0); }
/** * Load a file, and parse the contents. * @param filename Name of the file to load. \c nullptr means to read \c stdin. * @param line Line number of the current file. * @return The parsed node tree. */ std::shared_ptr<NamedValueList> LoadFile(const char *filename, int line) { static int nest_level = 0; static const char *include_cache[10]; static int line_number_cache[10]; /* Check for too many nested include levels. */ if (nest_level > 0) line_number_cache[nest_level - 1] = line; if (nest_level >= (int)lengthof(include_cache)) { fprintf(stderr, "Error: Too many nested file imports\n"); fprintf(stderr, " While importing \"%s\"\n", filename); for (int i = nest_level; i >= 0; i--) { fprintf(stderr, " from \"%s\" at line %d\n", include_cache[i], line_number_cache[i]); } exit(1); } include_cache[nest_level] = filename; nest_level++; /* Parse the input. */ FILE *infile = nullptr; if (filename != nullptr) { infile = fopen(filename, "rb"); if (infile == nullptr) { fprintf(stderr, "Error: Could not open file \"%s\"\n", filename); exit(1); } } _parsed_data = nullptr; SetupScanner(filename, infile); yyparse(); if (infile != nullptr) fclose(infile); if (_parsed_data == nullptr) { fprintf(stderr, "Parsing of the input file did not give a result\n"); exit(1); } /* Process imports. */ std::shared_ptr<NamedValueList> nvs = _parsed_data; nvs->HandleImports(); // Recursively calls this function, so _parsed_data is not safe. /* Restore to pre-call state. */ include_cache[nest_level] = nullptr; nest_level--; return nvs; }