#include <stdio.h>
#include <string.h>
#include <kate/oggkate.h>
static int get_packet(ogg_sync_state *oy,ogg_stream_state *os,int *init,ogg_packet *op)
{
char *buffer;
size_t bytes;
ogg_page og;
if (*init && ogg_stream_packetout(os,op)) return 0;
buffer=ogg_sync_buffer(oy,4096);
bytes=fread(buffer,1,4096,stdin);
if (bytes==0) return 1;
ogg_sync_wrote(oy,bytes);
while (ogg_sync_pageout(oy,&og)>0) {
if (!*init && ogg_page_bos(&og)) {
ogg_stream_init(os,ogg_page_serialno(&og));
}
ogg_stream_pagein(os,&og);
if (!*init && ogg_page_bos(&og)) {
ogg_packet op;
ogg_stream_packetpeek(os,&op);
if (op.bytes>=8 && !memcmp(op.packet,"\200kate\0\0\0",8)) {
*init=1;
}
else {
ogg_stream_clear(os);
}
}
}
return get_packet(oy,os,init,op);
}
int main()
{
ogg_sync_state oy;
ogg_stream_state os;
int init=0;
ogg_packet op;
kate_state k;
kate_info ki;
kate_comment kc;
const kate_event *ev;
ogg_sync_init(&oy);
kate_info_init(&ki);
kate_comment_init(&kc);
do {
get_packet(&oy,&os,&init,&op);
} while (kate_ogg_decode_headerin(&ki,&kc,&op)==0);
kate_decode_init(&k,&ki);
while (1) {
if (get_packet(&oy,&os,&init,&op)) break;
if (kate_ogg_decode_packetin(&k,&op)>0) break;
if (kate_decode_eventout(&k,&ev)==0) {
printf("Kate stream has text: %s\n",ev->text);
}
}
ogg_stream_clear(&os);
ogg_sync_clear(&oy);
kate_clear(&k);
kate_info_clear(&ki);
kate_comment_clear(&kc);
return 0;
}