Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Code voor c++ code formatteren. Niet gedacht aan '{' als char.  (gelezen 644 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
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);
}
}

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: Code voor c++ code formatteren. Niet gedacht aan '{' als char.
« Reactie #2 Gepost op: 2014/11/23, 14:28:31 »
De bedoeling is een functie volgens onderstaande manier:
bool incode(string line, int pos)
{
//code die true terug geeft als, het teken op de positie van pos in de variabele lijn niet in het type char of string staat.
//ook true terug sturen als het teken in commentaar staat.
}

Hoe moet ik deze functie van code voorzien?

Offline ekhnaton

  • Lid
  • Steunpunt: Nee
Re: Code voor c++ code formatteren. Niet gedacht aan '{' als char.
« Reactie #3 Gepost op: 2014/11/23, 14:40:52 »
wat betreft het gedeelte waar het om commentaar gaat kun je checken op // aan het begin van een regel (na  0D0A en evt spaces en tabs voor de indentering)  en die hele regel skippen
wat betreft het eerste deel wordt het aanzienlijk moeilijker je zou kunnen checken of het onderdeel is van een stringfunctie bv instr(**********) OF dat het gaat om een 'uitdrukking' die begint met ( en eindigt met )
het feitelijke coderen laat ik aan jezelf over
:)FINI LE TEMPS DU BOUFFON
Though I'm hardly ever smiling, I think it is hilarious it takes a Fool like me to see the madness of reality :)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: Code voor c++ code formatteren. Niet gedacht aan '{' als char.
« Reactie #4 Gepost op: 2014/11/23, 15:16:23 »
Er kan ook commentaar staan op een regel met code. De // staan dan niet aan het begin van een regel, maar verder op.

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
Re: Code voor c++ code formatteren. Niet gedacht aan '{' als char.
« Reactie #5 Gepost op: 2014/11/23, 16:21:19 »
Door middel van een regex kan je checken of een deel van een regel commentaar of een string literal is.

Bijvoorbeeld de regex //.*$ matcht alles dat begint met //, gevolgd door eender welk teken (.), 0 of meer keer herhaald, (*), tot het einde van de regel ($).

Je kan dan de indices van het begin en het einde van de match opvragen, en als een index van een karakter daar tussen ligt, zit het in een stuk commentaar.
« Laatst bewerkt op: 2014/11/23, 16:26:47 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline ekhnaton

  • Lid
  • Steunpunt: Nee
Re: Code voor c++ code formatteren. Niet gedacht aan '{' als char.
« Reactie #6 Gepost op: 2014/11/23, 16:27:15 »
je moet met die regex weer wel checken op spatie+// want anders kan het weer onderdeel van een URL zijn
:)FINI LE TEMPS DU BOUFFON
Though I'm hardly ever smiling, I think it is hilarious it takes a Fool like me to see the madness of reality :)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: Code voor c++ code formatteren. Niet gedacht aan '{' als char.
« Reactie #7 Gepost op: 2014/11/23, 17:09:34 »
Dit is een idee voor het controleren op het type char van de pos in line.
bool incode(string line, int pos)
{
bool r= true;
int l = line.length();
if (pos > 0 && pos < l -1)
{
if (line[pos-1] == '\'' && line[pos+1] == '\'')
{
r = false
}
}
return r;
}
« Laatst bewerkt op: 2014/11/24, 12:17:51 door bartveurink »