#include <stdio.h>
#include <stdlib.h>
#define line_size 80
void main(int argc, char* argv[])
{
enum {search, show_tag} state = search;
char line[line_size] = {'\0'};
int result = 0;
if( argc < 2 )
{
printf("usage: %s <tag> < <source_file>\n", argv[0]);
exit(1);
}
while( gets(line) )
{
switch(state)
{
case search:
if( line[0] == '#' )
{
result = strcmp(line + 1, argv[1]);
if( result == 0 )
state = process;
}
break;
case show_tag:
if( line[0] == '#' && line[1] == '/')
{
result = strcmp(line + 2, argv[1]);
if( result == 0 )
goto done;
} else
puts(line);
break;
}
}
done:
exit(0);
}
Здравствуйте, Анатолий Широков, Вы писали:
АШ>...
АШ>void main(int argc, char* argv[])
АШ>{
АШ> enum {search, show_tag} state = search;
...
АШ> while( gets(line) )
АШ> {
АШ> switch(state)
...
АШ> goto done;
...
АШ>done:
АШ> exit(0);
АШ>}
АШ>
Сложновато как-то, не находите? И никогда-никогда не вызывайте gets...
int main(int argc, char ** argv)
{
char * opentag = malloc(1 + strlen(argv[1]) + 1);
char * closetag = malloc(2 + strlen(argv[1]) + 1);
char line[LONG_ENOUGH + 1];
sprintf(opentag, "#%s\n", argv[1]);
sprintf(closetag, "#/%s\n", argv[1]);
/* Пропустить все до открывающего тэга */
while(fgets(line, LONG_ENOUGH, stdin) && strcmp(line, opentag))
;
/* Печатать все до закрывающего тэга */
while(fgets(line, LONG_ENOUGH, stdin) && strcmp(line, closetag))
puts(line);
return 0;
}
Один баг здесь еще присутствует: если среди blabla в нужном месте окажется нужный текст, файл будет обработан неправильно.
Так что по-хорошему, sed -n -e '0,/testX/d;/^#\/testX/q;0,$p/'