static void rtfSetCharset(RTFGroupData *group) { const char *charset_name; char *save_buf = input_buffer; if (forced_charset) return; if (getCharset(group->codepage)) return; charset_name = charset_from_codepage(group->codepage); check_charset(&source_csname,charset_name); input_buffer=NULL; // if (group->charset && *group->charset) { // free(group->charset); // group->charset = NULL; // } addCharset(read_charset(source_csname), group->codepage); group->charset = getCharset(group->codepage); if (!group->charset) group->charset = getDefaultCharset(); input_buffer = save_buf; }
void process_item (int rectype, int reclen, unsigned char *rec) { if (rectype != CONTINUE && prev_rectype == SST) { /* we have accumulated unparsed SST, and now encountered * another record, which indicates that SST is ended */ /* fprintf(stderr,"parse sst!\n");*/ parse_sst(sstBuffer,sstBytes); } switch (rectype) { case FILEPASS: { fprintf(stderr,"File is encrypted\n"); exit(69); break; } case WRITEPROT: /* File is write protected, but we only read it */ break; case 0x42: { if (source_charset) break; codepage=getshort(rec,0); /*fprintf(stderr,"CODEPAGE %d\n",codepage); */ if (codepage!=1200) { const char *cp = charset_from_codepage(codepage); source_charset=read_charset(cp); } break; } case FORMAT: { int format_code; format_code=getshort(rec,0); SetFormatIdxUsed(format_code); /* this debug code prints format string */ /* int i; char *ptr; fprintf(stderr,"Format %x \"",format_code); if (rec[2] == reclen - 3 && rec[3] != 0) { for (i=0,ptr=rec+3;i<rec[2];i++,ptr++) { fputc(*ptr,stderr); } } else { for (i=0,ptr=rec+5;i<rec[2];i++,ptr+=2) { fputc(*ptr,stderr); } } fprintf (stderr,"\"\n"); */ break; } case SST: { /* Just copy SST into buffer, and wait until we get * all CONTINUE records */ /* fprintf(stderr,"SST\n"); */ /* If exists first SST entry, then just drop it and start new*/ if (sstBuffer != NULL) free(sstBuffer); if (sst != NULL) free(sst); sstBuffer=(unsigned char*)malloc(reclen); sstBytes = reclen; if (sstBuffer == NULL ) { perror("SSTptr alloc error! "); exit(1); } memcpy(sstBuffer,rec,reclen); break; } case CONTINUE: { if (prev_rectype != SST) { return; /* to avoid changing of prev_rectype;*/ } sstBuffer=realloc(sstBuffer,sstBytes+reclen); if (sstBuffer == NULL ) { perror("SSTptr realloc error! "); exit(1); } memcpy(sstBuffer+sstBytes,rec,reclen); sstBytes+=reclen; return; } case LABEL: { int row,col; unsigned char **pcell; unsigned char *src=(unsigned char *)rec+6; saved_reference=NULL; row = getshort(rec,0); col = getshort(rec,2); /* fprintf(stderr,"LABEL!\n"); */ pcell=allocate(row,col); *pcell=copy_unicode_string(&src); break; } case BLANK: { int row,col;unsigned char **pcell; row = getshort(rec,0); col = getshort(rec,2); pcell=allocate(row,col); *pcell=NULL; break; } case MULBLANK: { int row, startcol,endcol; unsigned char **pcell; row = getshort(rec,0); startcol = getshort(rec,2); endcol=getshort(rec,reclen-2); pcell=allocate(row,endcol); *pcell=NULL; (void)startcol; break; } case CONSTANT_STRING: { int row = getshort(rec,0); int col = getshort(rec,2); unsigned char **pcell; int string_no=getshort(rec,6); if (!sst) { fprintf(stderr,"CONSTANT_STRING before SST parsed\n"); exit(1); } /* fprintf(stderr,"col=%d row=%d no=%d\n",col,row,string_no); */ saved_reference=NULL; pcell=allocate(row,col); if (string_no>=sstsize|| string_no < 0 ) { fprintf(stderr,"string index out of boundary\n"); exit(1); } else if (sst[string_no] !=NULL) { int len; unsigned char *outptr; len=strlen((char *)sst[string_no]); outptr=*pcell=malloc(len+1); strcpy((char *)outptr,(char *)sst[string_no]); } else { *pcell=malloc(1); **pcell = 0; } break; } case 0x03: case 0x103: case 0x303: case NUMBER: { int row,col; unsigned char **pcell; saved_reference=NULL; row = getshort(rec,0)-startrow; col = getshort(rec,2); pcell=allocate(row,col); *pcell=(unsigned char *)strdup(format_double(rec,6,getshort(rec,4))); break; } case INTEGER_CELL: { int row,col; unsigned char **pcell; row = getshort(rec,0)-startrow; col = getshort(rec,2); pcell=allocate(row,col); *pcell=(unsigned char *)strdup(format_int(getshort(rec,7),getshort(rec,4))); break; } case RK: { int row,col,format_code; unsigned char **pcell; saved_reference=NULL; row = getshort(rec,0)-startrow; col = getshort(rec,2); pcell=allocate(row,col); format_code = getshort(rec,4); *pcell=(unsigned char *)strdup(format_rk(rec+6,format_code)); break; } case MULRK: { int row,col,startcol,endcol,offset,format_code; unsigned char **pcell; row = getshort(rec,0)-startrow; startcol = getshort(rec,2); endcol = getshort(rec,reclen-2); saved_reference=NULL; for (offset=4,col=startcol;col<=endcol;offset+=6,col++) { pcell=allocate(row,col); format_code=getshort(rec,offset); *pcell=(unsigned char *)strdup(format_rk(rec+offset+2,format_code)); } break; } case FORMULA: { int row,col; unsigned char **pcell; saved_reference=NULL; row = getshort(rec,0)-startrow; col = getshort(rec,2); pcell=allocate(row,col); if (((unsigned char)rec[12]==0xFF)&&(unsigned char)rec[13]==0xFF) { /* not a floating point value */ if (rec[6]==1) { /*boolean*/ char buf[2]="0"; buf[0]+=rec[9]; *pcell=(unsigned char *)strdup(buf); } else if (rec[6]==2) { /*error*/ char buf[6]="ERROR"; *pcell=(unsigned char *)strdup(buf); } else if (rec[6]==0) { saved_reference=pcell; } } else { int format_code=getshort(rec,4); *pcell=(unsigned char *)strdup(format_double(rec,6,format_code)); } break; } case STRING: { unsigned char *src=(unsigned char *)rec; if (!saved_reference) { fprintf(stderr,"String record without preceeding string formula\n"); break; } *saved_reference=copy_unicode_string(&src); break; } case BOF: { if (rowptr) { fprintf(stderr,"BOF when current sheet is not flushed\n"); free_sheet(); } break; } case XF: case 0x43: /*from perl module Spreadsheet::ParseExecel */ { short int formatIndex = getshort(rec,2); /* we are interested only in format index here */ if (formatTableIndex >= formatTableSize) { formatTable=realloc(formatTable, (formatTableSize+=16)*sizeof(short int)); if (!formatTable) { fprintf(stderr,"Out of memory for format table"); exit (1); } } formatTable[formatTableIndex++] = formatIndex; break; } case MS1904: /* Macintosh 1904 date system */ date_shift=24107.0; break; case MSEOF: { if (!rowptr) break; print_sheet(); free_sheet(); break; } case ROW: { /* fprintf(stderr,"Row! %d %d %d\n",getshort(rec,0), getshort(rec+2,0),getshort(rec+4,0)); */ break; } case INDEX: { /* fprintf(stderr,"INDEX! %d %d\n", getlong(rec+4,0), getlong(rec+8,0)); */ break; } default: { #if 0 fprintf(stderr,"Unknown record 0x%x\n length %d\n",rectype,reclen); #endif } } prev_rectype=rectype; }