Deze code is nagenoeg compleet.
Het formatteert c++ code. Het zet de { en } op nieuwe regels. Met het scheidingsteken ; worden lijnen opgedeeld. Probleem is dat deze tekens in commentaar, charachter of in string kunnen voorkomen. Ook in die gevallen worden de regels veranderd. Dit is een fout en ik weet niet hoe ik dit kan oplossen. Verder kan het tabs aan het begin van regels zetten afhankelijk van de { en } tekens. Er kunnen nog meer fouten in zitten.
Usage: formatcode [-f file] [-a, -s, -t]
a is voor accolades aanpassen.
s is voor semicolons aanpassen.
t is voor tabs toevoegen.
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;
string usage(string program_name)
{
string use;
use = "Usage: " + program_name + "[-f file]";
return use;
}
int ntab = 0;
char f;
string n2tab(int n)
{
string tabs = "";
for (int i=0;i<n;i++)
{
tabs += '\t';
}
}
void addtabs(string line)
{
if (line[0] == '{')
{
ntab += 1;
}
else if (line[0] == '}')
{
ntab -= 1;
}
cout << n2tab(ntab) + line << endl;
}
void semicolon(string line)
{
int a = 0;
string sub;
string restsub;
char sign;
// tabs verwijderen
line.erase(remove(line.begin(),line.end(),'\t'),line.end());
for (int i=0; i < line.length();i++)
{
// Hier moet gecontroleerd worden of ; een char is of code
// ook fout als de tekens in het commentaar staan.
// fout als tussen " " staan.
if (line[i] == ';')
{
sub = line.substr(a,(i- a))
sign = line[i];
if (line.length() > i)
{
a = i + 1;
{
}
cout << sub + sign << endl;
}
if (a < line.length() - 1)
{
restsub = line.substr(a,line.length()-a);
cout << restsub << endl;
}
}
// format de accolades op nieuwe regels.
void accolade(string line)
{
int a = 0;
string sub;
string restsub;
char sign;
// tabs verwijderen
line.erase(remove(line.begin(),line.end(),'\t'),line.end());
//
for (int i=0; i < line.length();i++)
{
// Hier moet gecontroleerd worden of { } een char is of code
// ook fout als de tekens in het commentaar staan.
// en fout als tussen " " staan.
if (line[i] == '{' || line[i] == '}')
{
sub = line.substr(a,(i- a));
sign = line[i];
if (line.length() > i)
{
a = i + 1;
}
if (!sub.empty())
{
cout << sub << endl;
}
cout << sign << endl;
}
}
if (a < line.length() - 1)
{
restsub = line.substr(a,line.length()-a);
cout << restsub << endl;
}
}
void format_input(istream* input)
{
void (*option)(string) = NULL;
switch (f)
{
case 'a':
option = &accolade;
break;
case 's':
option = &semicolon;
break;
case 't':
option = &addtabs;
break;
default:
break;
}
string lineInput;
while (getline(*input,lineInput))
{
if (!lineInput.empty())
{
(*option)(lineInput);
}
}
}
int main(int argc, char* argv[])
{
char* file = NULL;
istream * input = NULL;
// weergave van het gebruik van het programma met optie --help
if (argc > 1 && string(argv[1]) == "--help"){cout << usage(argv[0]) << endl; return 0;}
// Argumenten van commandline inlezen.
for (int i=1; i < argc; i++)
{
if (string(argv[i]) == "-a")
{
f = 'a';
}
if (string(argv[i]) == "-s")
{
f = 's';
}
if (string(argv[i]) == "-t")
{
f = 't';
}
if (string(argv[i]) == "-f" && i < argc -1)
{
i += 1;
file = argv[i];
}
}
// Als geen file als argument word gegeven, dan input van pipeline
if (file == NULL)
{
format_input(&cin);
}
else
{
//betand inlezen.
ifstream fin (file);
format_input(&fin);
}
}