Skip to content

Instantly share code, notes, and snippets.

@leomastoras
Created April 14, 2024 11:47
Show Gist options
  • Save leomastoras/769c0ea0d7cf5b5399d33804fd2e393f to your computer and use it in GitHub Desktop.
Save leomastoras/769c0ea0d7cf5b5399d33804fd2e393f to your computer and use it in GitHub Desktop.
Takis 2 IF
/* file: indent.c */
#include <stdio.h>
/* MACRO gia na ektiponei X arithmo apo tabs */
#define PRINTTABS(X) do {int i; for(i=0;i<(X);i++) printf("\t");} while(0)
/* 5 diaforetikes katastaseis pou briskete o parser */
#define STATE_NOSPACE 1 /* katastasi whitespace eksoterika ton entolon */
#define STATE_ONESPACE 2 /* katastasi whitespace esoterika mias entolis */
#define STATE_ENTOLI 3 /* katastasi anagnosis entolis */
#define STATE_QUOTES 4 /* katastasi anagnosis simbolosiras i xaraktira */
#define STATE_DIESI 5 /* katastasi anagnosis gramis preprocessor */
/* arxiki katastasi parser */
int state=STATE_NOSPACE;
int main()
{
int c; /* xaraktiras isodou */
int tabs=0; /* arithmos tabs */
int currentquote=0; /* apothikeyi to quote pou anikse */
int parc=0; /* arithmos anixton parentheseon */
while ((c=getchar())!=EOF)
{
/* periptosi whitespace
* se aftin tin periptosi o xaraktiras den ektiponete
* stin eksodo ektos an briskete esoterika quotes i
* i se grami tou preprocessor
*/
if (isspace(c)) {
if (state==STATE_NOSPACE)
continue;
else if (state==STATE_DIESI) {
if (c=='\n')
state=STATE_NOSPACE;
} else if (state==STATE_ONESPACE)
continue;
else if (state==STATE_ENTOLI) {
state=STATE_ONESPACE;
continue;
} else if (state==STATE_QUOTES) ;
/* periptosi escape character \
* se aftin tin periptosi o epomenos xaraktiras
* den pernaei ton elegxo ke apla ektiponete
*/
} else if (c=='\\') {
if (state==STATE_QUOTES) {
putchar(c);
c=getchar();
}
/* periptosi mono i diplo quote
* an den briskete se katastasi pou exei idi
* kapio anixto quote tote thetei to currentquote
* sto quote pou diavastike. alios klinei to
* anixto quote ke epistrefei se katastasi anagnosis entolis
*/
} else if (c=='\''||c=='\"') {
if (state==STATE_NOSPACE) {
PRINTTABS(tabs);
currentquote = c;
state=STATE_QUOTES;
}
else if (state==STATE_DIESI) ;
else if (state==STATE_ONESPACE) {
putchar(' ');
currentquote = c;
state=STATE_QUOTES;
} else if (state==STATE_ENTOLI) {
currentquote = c;
state=STATE_QUOTES;
} else if (state==STATE_QUOTES) {
if (c==currentquote)
state=STATE_ENTOLI;
}
/* periptosi semicolon
* an to semicolon briskete mesa se quotes, se preprocessor
* i esoterika parentheseon apla ektiponete alios simenei
* oti telionei i katastasi entolis ke metaferete se katastasi whitespace
*/
} else if (c==';') {
if (state==STATE_NOSPACE) {
if (parc==0) {
PRINTTABS(tabs);
printf(";\n");
continue;
}
}
else if (state==STATE_DIESI) ;
else if (state==STATE_ONESPACE) {
if (parc==0) {
printf(";\n");
state=STATE_NOSPACE;
continue;
} else {
putchar(' ');
}
}
else if (state==STATE_ENTOLI) {
if (parc==0) {
printf(";\n");
state=STATE_NOSPACE;
continue;
}
}
else if (state==STATE_QUOTES) ;
/* periptosi open bracket
* an briskete ektos quotes ke preprocessor
* tote ektipononte ta tabs ke afksanonte kata 1
* etsi oste oi epomenes entoles na briskonte 1
* thesi deksia. i katastasi metabalete se whitespace
*/
} else if (c=='{') {
if (state==STATE_NOSPACE) {
PRINTTABS(tabs);
putchar('{');
putchar('\n');
tabs++;
continue;
}
else if (state==STATE_DIESI) ;
else if (state==STATE_ONESPACE) {
putchar('\n');
PRINTTABS(tabs);
putchar('{');
putchar('\n');
tabs++;
state=STATE_NOSPACE;
continue;
}
else if (state==STATE_ENTOLI) {
putchar('\n');
PRINTTABS(tabs);
putchar('{');
putchar('\n');
tabs++;
state=STATE_NOSPACE;
continue;
}
else if (state==STATE_QUOTES) ;
/* periptosi close bracket
* omoia me open bracket
*/
} else if (c=='}') {
if (state==STATE_NOSPACE) {
tabs--;
PRINTTABS(tabs);
putchar('}');
putchar('\n');
continue;
}
else if (state==STATE_DIESI) ;
else if (state==STATE_ONESPACE) {
putchar('\n');
tabs--;
PRINTTABS(tabs);
putchar('}');
putchar('\n');
continue;
}
else if (state==STATE_ENTOLI) {
putchar('\n');
tabs--;
PRINTTABS(tabs);
putchar('}');
putchar('\n');
continue;
}
else if (state==STATE_QUOTES) ;
/* periptosi diesi
* metabalete se katastasi anagnosis entolis preprocessor
* efoson i proigoumeni katastasi itan whitespace
*/
} else if (c=='#') {
if (state==STATE_NOSPACE)
state=STATE_DIESI;
else if (state==STATE_DIESI) ;
else if (state==STATE_ONESPACE) ;
else if (state==STATE_ENTOLI) ;
else if (state==STATE_QUOTES) ;
/* periptosi parenthesis
* afksomionete o arithmos parc analoga me to an
* i parenthesi ine open i close etsi oste na agnoite
* to semicolon pou briskete esoterika afton
*/
} else if (c=='('||c==')') {
if (state==STATE_NOSPACE) {
if (c=='(')
parc++;
else
parc--;
}
else if (state==STATE_DIESI);
else if (state==STATE_ONESPACE) {
putchar(' ');
state=STATE_ENTOLI;
if (c=='(')
parc++;
else
parc--;
}
else if (state==STATE_ENTOLI) {
if (c=='(')
parc++;
else
parc--;
}
else if (state==STATE_QUOTES);
/* periptosi opioudipote alou xaraktira
* tipononte ta tabs i o kenos xaraktiras
* analoga me tin proigoumeni katastasi
* ke alazei se katastasi anagnosis entolis
*/
} else {
if (state==STATE_NOSPACE) {
state=STATE_ENTOLI;
PRINTTABS(tabs);
}
else if (state==STATE_DIESI) ;
else if (state==STATE_ONESPACE) {
putchar(' ');
state=STATE_ENTOLI;
}
else if (state==STATE_ENTOLI) ;
else if (state==STATE_QUOTES) ;
}
putchar(c);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment