#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;
};
// ãëàâíàÿ ïðîãðàììà ------ êîíåö