Esempio n. 1
0
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);
}
Esempio n. 2
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;
}