We're a community of 1.1M IT Pros here for help, advice, solutions, professional growth and fun. Join us!
1,080,445 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?

Formatting C++ files

0
By Lucaci Andrei on Jul 4th, 2012 1:04 pm

This is a program which I made back in the beginnings when I was trying to figure out how to work with strings, and how to work with files.
This is suppose to format a C++ code, for example if the syntax of an if statement is

if (condition)
{
    do stuff;
}

if will format it to

if (condition){
    do stuff;
}

same as for while and for loops. It will also format the return values, if for example the syntax is

return value;

it will enclose value in open brackets () etc.

/*
 * format-files.cpp
 * format-files.cpp is licensed under GNU GENERAL PUBLIC LICENSE
 *  Created on: Feb 8, 2012
 *      Author: sin
 */
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Format{
	string line;
	ifstream fin;
	ofstream fout;

public:
	Format(){
	}
	Format(string filename){
		fin.open(filename.c_str(), ios::in);
		string _new_filename="_"+filename;
		if (check(_new_filename)){
			cout<<_new_filename<<" already exists.\nPress <RETURN> to exit.\n";
			fin.close();
			cin.ignore();
			exit(0);
		}
		else fout.open(_new_filename.c_str(), ios::app);
	}

	bool check(string filename){
		/*
		 * Checks if the file exists or not.
		 */
	    ifstream infile(filename.c_str());
	    return (infile.good());
	}

	void formatAll(int i){
		/*
		 * Format starter.
		 */
		while (getline(fin, line)){
			if (i==1) fout<<formatVoidMainArg(formatVoidMain(formatIncludes(formatS((formatReturn(line))))))<<'\n';
			else if (i==2) fout<<formatReturn(line)<<'\n';
			else if (i==3) fout<<formatS(line)<<'\n';
			else if (i==4) fout<<formatIncludes(line)<<'\n';
			else if (i==5) fout<<formatVoidMainArg(formatVoidMain(line))<<'\n';
		}
	}

	string formatReturn(string line){
		/*
		 * Formats the return statements.
		 */
		string temp=line;
		size_t found=temp.find("return ");
		if (found!=string::npos){
			size_t ff=temp.find(';');
			if (ff!=string::npos){
				temp.erase(ff, 1);
				string sub=temp.substr(found+7, found+ff-2);
				temp.replace(found+7, found+sub.size()-1, "("+sub+");");
			}
		}
		return (temp);
	}

	string formatLine(string line){
		/*
		 * Formats the line.
		 */
		string temp;
		getline(fin, temp);
		if (temp[temp.size()-1]!=';')
			line+="{";
		else line+="\n"+temp;
		return (line);
	}

	string formatVoidMain(string line){
		/*
		 * Format old main() functions.
		 */
		if (line.find("void main()")!=string::npos){
			line="int main()";
			if (line.find("{")==string::npos){
				line=formatLine(line);
			}
		}
		return (line);
	}

	string formatVoidMainArg(string line){
		if (line.find("void main(int argc, char *argv[])")!=string::npos){
			line="int main(int argc, char *argv[])";
			if (line.find("{")==string::npos){
				line=formatLine(line);
			}
		}
		return (line);
	}

	string formatS(string line){
		/*
		 * Formats loops and conditionals.
		 */
		if (line.find("if ")!=string::npos || line.find("else if")!=string::npos
				|| line.find("else")!=string::npos || line.find("for ")!=string::npos
				|| line.find("while ")!=string::npos){
			if (line[line.size()-1]!=';')
				line=formatLine(line);
		}
		return (line);
	}

	string formatIncludes(string line){
		/*
		 * Formats old/bad includes.
		 */
		if (line.find("#include <iostream.h>")!=string::npos){
			line="#include <iostream>";
		}
		if (line.find("#include <conio.h>")!=string::npos || line.find("getch();")!=string::npos){
			line="";
		}
		return (line);
	}

	~Format(){
		fin.close();
		fout.close();
	}
};

int main(){
	string filename;
	Format fs;
	cout<<"Filename: ";
	cin>>filename;
	if (fs.check(filename)){
		Format f(filename);
		cout<<"1. Format all.\n"
			<<"2. Format the returns.\n"
			<<"3. Format loops and if statements.\n"
			<<"4. Format the includes.\n"
			<<"5. Format the main function.\n"
			<<"Check file: _"<<filename<<" for the result.\n"
			<<"> ";
		string answer;
		cin>>answer;
		if (answer=="1" or answer=="1.") f.formatAll(1);
		else if (answer=="2" or answer=="2.") f.formatAll(2);
		else if (answer=="3" or answer=="3.") f.formatAll(3);
		else if (answer=="4" or answer=="4.") f.formatAll(4);
		else if (answer=="5" or answer=="5.") f.formatAll(5);
		else cout<<"Invalid command.\n";
	}
	return (0);
}

Good subject, unfortunately, when I tested, it only added some () for return, nothing else and did not fix bad indention (done by purpose to test the code).

pyTony
pyMod
Moderator
6,330 posts since Apr 2010
Reputation Points: 879
Solved Threads: 989
Skill Endorsements: 27

Well, was an old project of mine from "my begginings" in C++, thou the ideea of accomplishing something like this would be awesome.
What can I say:d, it isn't bugg free.

Lucaci Andrew
Practically a Master Poster
690 posts since Jan 2012
Reputation Points: 108
Solved Threads: 97
Skill Endorsements: 13

Post: Markdown Syntax: Formatting Help
 
You
View similar articles that have also been tagged:
 
© 2013 DaniWeb® LLC
Page generated in 0.0570 seconds using 2.65MB