This repository has been archived on 2021-10-31. You can view files and clone it, but cannot push or open issues or pull requests.
sys_prog/headlines/headlines.c

83 lines
1.4 KiB
C

#include <stdio.h>
#include <string.h>
int heading_length(const char heading_char) {
int c;
unsigned int i = 0;
while ((c = getchar()) == heading_char) {
i++;
}
if (c != EOF) {
ungetc(c, stdin);
return i;
} else {
return -1;
}
}
void print_section(unsigned int* section_arr, int level) {
for (int i = 0; i <= level; i++) {
printf("%u.", section_arr[i]);
}
printf("%u)", section_arr[level + 1]);
}
int main(int argc, const char** argv) {
char sect;
if (argc == 1) {
sect = '*';
} else if (argc == 3 && !strcmp(argv[1], "-c")) {
sect = argv[2][0];
} else {
printf("Usage: %s [-c {symbol}]\n", argv[0]);
return 1;
}
int level = 0;
unsigned int sections[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
int begin_of_line = 1;
int c;
while ((c = getchar()) != EOF) {
if (!begin_of_line) {
putchar(c);
while ((c = getchar()) != '\n' && c != EOF)
putchar(c);
if (c == EOF) break;
putchar('\n');
begin_of_line = 1;
} else {
int n = heading_length(sect);
if (n > 8) {
n = 8;
}
begin_of_line = 0;
if (n == -1) break;
if (n == 0) continue;
n--;
if (level == n) {
sections[level]++;
} else if (n > level) {
for (int i = level + 1; i < n; i++)
sections[i] = 0;
sections[n] = 1;
level = n;
} else {
sections[n]++;
level = n;
}
print_section(sections, level);
}
}
return 0;
}