Created
April 14, 2024 11:47
-
-
Save leomastoras/769c0ea0d7cf5b5399d33804fd2e393f to your computer and use it in GitHub Desktop.
Takis 2 IF
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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