#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <cstdlib>

using namespace std;

#define NFILES 13

string files[NFILES] =   {"yaam_primitive_predicates",
                          "yaam_call",
						  "yaam_call_count",
						  "yaam_cut",
						  "yaam_failure",
						  "yaam_get",
						  "yaam_indexing_ext",
						  "yaam_indexing_std",
						  "yaam_misc",
						  "yaam_pop",
						  "yaam_put",
						  "yaam_unify",
						  "yaam_write"};

int main(int argc, char **argv)
{
    std::string fileinname, fileoutname, linein, lineout;
    char lineout_char[256];
    ifstream filein;
    ofstream fileout;
    int k;
	for (int i = 0; i < NFILES; i++)
	{
		linein = "";
		lineout = "";
		fileinname = files[i] + ".h";
		fileoutname = files[i] + "_mod.h";
		filein.open(fileinname.c_str());
		if (!filein.is_open()) {
			cout << "Erro ao abrir arquivo " << fileinname << " para leitura! Saindo..." << endl;
			exit(1);
		}
		fileout.open(fileoutname.c_str());
		if (!fileout.is_open()) {
			cout << "Erro ao abrir arquivo " << fileoutname << " para escrita! Saindo..." << endl;
			exit(1);
		}
		cout << "Processando arquivo " << fileinname << "!\n";
		getline(filein, linein);
		while (!filein.eof())
		{
		    lineout = "";
		    strcpy(lineout_char, "");
		    //cout << "linein = " << linein << endl; /* */
			if (linein.size() > 6)
			{
				if (linein.substr(0, 7) == "#define")
				{
					lineout = "#define";
					k = 0;
					for (int j = 7; j < linein.size(); j++)
					{
						if (linein[j] >= 'a' && linein[j] <= 'z')
						{
						    //cout << "linein[j] = " << linein[j] << endl;
						    lineout_char[k++] = linein[j] - 32;
						}
						else
						{
							lineout_char[k++] = linein[j];
						}
					}
					lineout_char[k] = '\0';
					lineout += lineout_char;
					//cout << "lineout 1 = " << lineout << endl;
				}
				else
				{
					lineout = linein;
					//cout << "lineout 2 = " << lineout << endl;
				}
			}
			else
			{
				lineout = linein;
				//cout << "lineout 3 = " << lineout << endl;
			}
		fileout << lineout << endl;
		getline(filein, linein);
		}
		lineout = linein;
		fileout << lineout << endl;
		filein.close();
		fileout.close();
	}
    return 0;
}