/* xmlind.c: indent XML text */ #include main() { register char c; register tag = 0; /* in tag */ register i, indent = 0, blank = 0; /* a tag or a maximal text segment is processed at each step */ for(c = getchar() ; c != EOF;) { if(c == '<') { /* tag */ if((c = getchar()) == '/') { /* end tag */ indent--; if(tag < 0) { putchar('\n'); for(i = 0; i < indent; i++) printf(" "); } else tag = -1; printf("' && c != EOF;) if(c == '\n') { c = getchar(); if(c != '>') putchar(' '); } else if(c == '/') { putchar('/'); if((c = getchar()) == '>' && tag == 1) indent--; tag = -1; } else if(c == '"') { putchar('"'); for(c = getchar(); c != '"' && c != EOF; c = getchar()) putchar(c); if(c == '"') { putchar('"'); c = getchar(); } } else { putchar(c); c = getchar(); } if(c == '>') { putchar('>'); for(c = getchar(); c == '\n' || c == ' '; c = getchar()); } } else { /* text */ if(tag < 0) { /* just after end tag */ putchar('\n'); for(i = 0; i < indent; i++) printf(" "); } else tag = 0; for(blank = 0; c != '<' && c != EOF; c = getchar()) if(c == '\n' || c == ' ') { if(blank == 0) { putchar(' '); blank = 1; } } else { putchar(c); blank = 0; } } } putchar('\n'); }