1 /*****************************************************************/
2 /* Output of unicode buffers with conversion into target encoding*/
3 /* And application of substitution maps */
5 /* This file is part of catdoc project */
6 /* (c) Victor Wagner 1996-2003, (c) Alex Ott 2003 */
7 /*****************************************************************/
15 /************************************************************************/
16 /* performs paragraph formatting if wrap_margin is non-zero */
17 /* gets character sequence and appends it to buffer. If buffer is long */
18 /* enough, prints its beginning out */
19 /* Input parameter is pointer to the string which represents one unicode*/
20 /* character after character set translation. See convert_char ina */
22 /************************************************************************/
23 static char outputbuffer[LINE_BUF_SIZE]="";
24 void out_char(const char *chunk) {
27 const char *p; char *q;
33 for (q=outputbuffer+bufpos,p=chunk;
35 *(q++)=*(p++),bufpos++) {
36 if (*p=='\n') eol_flag=1;
39 /* This strcat is safe. wrap margin setting
40 code in main.c ensures that wrap_margin is
41 less than LINE_BUF_SIZE-strlen(largest chunk)
44 /* End of paragraph */
45 char *q = map_subst(spec_chars,'\n');
46 fputs(outputbuffer,stdout);
54 } else if (bufpos>wrap_margin) {
55 char *q=outputbuffer,*p=outputbuffer+wrap_margin;
57 while (p>outputbuffer&&*p!=' '&& *p!='\t') p--;
58 if (p==outputbuffer) {
59 /*worst case - nowhere to wrap. Will use brute force */
61 if (from_unicode == to_utf8) {
62 /* go back to start of nearest utf-8 character */
63 while(i>0 && (outputbuffer[i] & 0xC0) == 0x80) i--;
65 fwrite(outputbuffer,i,1,stdout);
71 fputs(outputbuffer,stdout);
74 for(q=outputbuffer;*p;p++,q++) *q=*p;
75 bufpos=q-outputbuffer;
80 /************************************************************************/
81 /* Main output function.
82 * Programs which read word-processor files should accumulate paragraphs
83 * in the buffer as array of unicode 16-bit codes and pass to this
85 ************************************************************************/
86 void output_paragraph(unsigned short int *buffer) {
87 unsigned short int *p;
89 for (p=buffer;*p;p++) {
90 out_char(convert_char(*p));