#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

#define max_line 80

#define max_sym_tab 20

 

 

// ÷òåíèå äàííûõ èç ôàéëà - ÷èòàåòñÿ Çàïèñü, íî âîçâðàùàåòñÿ Ñ ñòðîêà â buf

// äëèíîé íå áîëåå l_str_max  èç ôàéëà h

// â êîíöå ôàéëà âîçâðàùàåòñÿ NULL

char * mfgets(char *, int, FILE * );

 

 

char * mfgets( char* buf, int l_str, FILE* h)

{

  char c;

  int l=0, buf_l=0;

   c=fgetc(h);

   if (c == EOF ) return NULL;

   while (  (c != '\n') && (c != '\r') && (c != EOF) )

      {

       if ( (l++) <  (l_str-1) ) buf[buf_l++]=c;

       c=fgetc(h);

      };

   buf[buf_l]='\0';

   return buf;

};

 

struct sym_tab

 { int n_str;

   char n_file[max_line];

 };

 

 

// ïðîãðàììû îðãàíèçàöèè ÑÒÅÊÀ

// ïàìÿòü äëÿ ÑÒÅÊÀ

char  s_file[10][max_line];

// óêàçàòåëü ÑÒÅÊÀ

int s_ptr=-1;

// ïîìåñòèòü â ÑÒÅÊ

int stek_push( char * );

// âçÿòü èç ÑÒÅÊÀ

int stek_pop( char * file);

 

 

 

// ïðîãðàììû ðàáîòû ñ ñòåêîì

int stek_push( char * file)

{ s_ptr++;

  if(s_ptr > 9) {printf("ïåðåïîëíåíèå ñòåêà file=%s",  file);

                  exit(16); };

  strcpy(s_file[s_ptr], file);

  return 1;

};

 

int stek_pop( char * file)

{

  if(s_ptr < 0 ) return 0;

 

  strcpy(file,s_file[s_ptr]);

  s_ptr--;

  return 1;

};

// ïðîãðàììû ðàáîòû ñ ñèìâîëè÷åñêîé òàáëèöåé èìåí

sym_tab TAB[max_sym_tab];

int ptr_tab=0;

// ïîìåñòèòü â òàáëèöó

int to_sym_tab(sym_tab t)

{

   TAB[ptr_tab].n_str=t.n_str;

   strcpy(TAB[ptr_tab].n_file, t.n_file);

   if ( (ptr_tab++) > max_sym_tab)

      {

        printf("Ïåðåïîëíåíèå òàáëèöû èìåí ....\n");

        exit(666);

        return 0;

      };

  return 1;

};

// ðàñïå÷àòàòü òàáëèöó

void print_sym_tab()

{ int i;

  for (i=0; i < ptr_tab; i++)

   printf("#=%d n_str=%d n_file=<%s>\n",i, TAB[i].n_str, TAB[i].n_file);

  return;

};

 

// íàéòè â òàáëèöå - çàïîëíÿåò âõîäíóþ ñòðóêòóðó - ïî èìåíè íàõîäèò ¹ ñòðîêè

// âîçðàùàåò 1 ïðè óñïåõå èëè 0 ïðè íåâîçìîæíîñòè íàéòè...

int seek_sym_tab(sym_tab &t)

{ int i;

  for (i=0; i < ptr_tab; i++)

   { if (strcmp(TAB[i].n_file,t.n_file) == 0 )

      { t.n_str=TAB[i].n_str;  

        return 0;

      };

   };

  return 1;

};

 

// ãëàâíàÿ ïðîãðàììà ------ íà÷àëî

int main(void)

{

   int kod;           // êîä âîçâðàòà

   FILE * h, * out;

   char file_out[max_line], file_tek[max_line], file_new[max_line], file_menu[max_line];

   char buf[max_line+2];

   sym_tab t;

   int num_str_out;

 

   strcpy(file_out,"tmp_link.txt");

   strcpy(file_tek,"u0.txt");

   strcpy(file_menu,"menu_link.txt");

 

 

   out=fopen(file_out, "w");

   if (out == NULL ){printf( "Cannot open output file <%s> \n", file_out); getch(); return -1;};

   num_str_out=0;

 

   stek_push(file_tek);

   //kod=stek_pop(file_tek); puts(file_tek); printf("kod=%d\n",kod);

 

   while ( stek_pop(file_tek) != 0 )

    {

     // puts(file_tek); 

      h=fopen(file_tek, "r");

      if (h == NULL )

        { printf( "Cannot open input file <%s> \n", file_tek);

          fclose (out);

          getchar();

          return -1;};

 

      // ïîìåñòèòü â sym_tab

      t.n_str=num_str_out;

      strcpy(t.n_file,file_tek);

      to_sym_tab(t);

 

 

      while ( mfgets(buf, max_line+2, h) != NULL )

        {

 

          fprintf(out, "%s\n", buf);

          num_str_out++;

          //puts(buf);

 

          if ( buf[0] == '1' )

           {

             sscanf( buf+2, "%s", file_new);

             stek_push(file_new);

           };

        };

      fclose (h);

 

    };

  fclose (out);

  print_sym_tab();

//=================================

  h = fopen(file_out, "r");

   if (out == NULL ){printf( "Cannot open input temp file <%s> \n", file_out);

                     getch(); return -1;};

  out=fopen(file_menu, "w");

   if (out == NULL ){printf( "Cannot open output file <%s> \n", file_menu);

                     fclose(h); getch(); return -1;};

 

  while ( mfgets(buf, max_line+2, h) != NULL )

        {

           if ( buf[0] == '1' )

             { sscanf( buf+2, "%s", t.n_file);

               if (seek_sym_tab( t ) == 1)

                    { printf("Ôàéë <%s> íå íàéäåí â òàáëèöå ñèìâîëè÷åñêèõ èìåí....\n", t.n_file);

                      fclose(h); fclose(out); return -1;

                    };

               sprintf(buf+2, " %d", t.n_str);

             };

 

           fprintf(out, "%s\n", buf);

        };

 

  fclose(h); fclose(out);       

 

  return 0;

};

// ãëàâíàÿ ïðîãðàììà ------ êîíåö