Что не так в этом куске кода, никак не пойму. Короткая программка должна тупо вырезать любые xml-теги из входного файла. Просто убирая все теговое, начиная с символа скобка влево и заканчивая скобка вправо.
Если символы не убирать, а заменять, то все нормально, алгоритм работает и на выходе тот же текст, но с забитыми символами на месте тегов. Если убирать (не копированием из одного буфера в другой), то возникают глюки. Часть символов почему-то не копируется.
Проблема тупо в косяке с указателями и длиной буфера? Или с функцией fputs, хотя ее замена на write ничего не дает. Чистка выходного буфера memset тоже ничего не меняет.
Программа открывает файл, читает его функцией read в входной буфер, затем в функции copybuf вырезает теги и копирует то, что без них. Вырезание тегов сделано тупо автоматом с флагом-глобальной переменной tagstatus. Если 0 - символы копируем, если 1 - не копируем, пока не встретим закрывающую угловую скобку.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define BSIZE 64
int copybuf(int bufsize, char* input, char* output);
int tagstatus;
int main(int argc, char** argv)
{
/* set buffer */
ssize_t readlen; // bytes
char inputbuffer[BSIZE+1];
char outputbuffer[BSIZE+1];
/* Open file */
int f = open (argv[1],O_NOATIME|O_RDONLY);
if (f<0)
{
fprintf(stderr, "buf: Cannot open file '%s'\n",argv[1]);
return 1;
}
/* read file */
tagstatus=0;
while ((readlen = read (f, inputbuffer, BSIZE)) > 0)
{
int len=copybuf(readlen,inputbuffer,outputbuffer);
if (len>0)
{
outputbuffer[len]=0;
fputs (outputbuffer, stdout);
}
}
if (readlen < 0)
{
fprintf (stderr, "buf: Cannot read file\n");
close(f);
return 1;
}
close(f);
return 0;
}
/* copybuf function */
int copybuf(int bufsize, char* input, char* output)
{
/* return count of really copied bytes */
int len=0;
for (int i=0; i<bufsize; i++)
{
if (tagstatus==0) //outside a tag, main text
{
if (input[i]!='<') //no start tag
{
output[i]=input[i];len++;
continue;
}
else
{
tagstatus=1;//new tag start
continue;
}
}
else //inside a tag
{
if (input[i]=='>') //end tag
{
tagstatus=0;//close tag
continue;
}
}
}
return len;
}