#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reshift(const char *in, int nesting);

static void parse_include_directive(FILE *input, int nesting)
{
    char filename[32];

    // Читаем имя файла в filename, пока не встретим '>'.
    for (size_t i = 0; i < sizeof(filename) / sizeof(filename[0]); i++)
    {
        int c = fgetc(input);
        if (c == EOF)
        {
            fprintf(stderr, "unexpected EOF in include directive\n");
            exit(1);
        }

        if (c == '>')
        {
            // Нашли конец имени. Используем и выходим.
            filename[i] = '\0';
            reshift(filename, nesting + 1);
            return;
        }

        filename[i] = c;
    }

    fprintf(stderr, "too long filename\n");
    exit(1);
}

void reshift(const char *in, int nesting)
{
    if (nesting > 5)
    {
        fprintf(stderr, "recursion too deep\n");
        exit(1);
    }

    FILE *input = fopen(in, "r");
    if (!input)
    {
        perror("unable to open included file");
        exit(1);
    }

    const char include_prefix[] = "include<";

    int c;
    size_t prefix_pos = 0;

    while ((c = fgetc(input)) != EOF)
    {
        // Если символ - начало или продолжение префикса, следующий символ
        // будем матчить со следующим символом префикса.
        if (c == include_prefix[prefix_pos])
        {
            ++prefix_pos;

            // Если префикс кончился, обрабатываем имя.
            if (include_prefix[prefix_pos] == '\0')
            {
                // Оно само сожрет имя файла и >.
                parse_include_directive(input, nesting);
                prefix_pos = 0;
            }
        }
        else
        {
            // Матчили-матчили, но не сматчили. Выводим, то, что сматчилось,
            // если такое было.
            for (size_t i = 0; i < prefix_pos; i++)
            {
                putchar(include_prefix[i]);
            }

            prefix_pos = 0;

            // И не сматчившийся символ тоже выводим.
            putchar(c);
        }
    }
}

int main(void)
{
    reshift("input.txt", 0);
}
