/* @(#)catrib.c SPDsoft 19/8/93 */ #include #include #include #include #include "rcat.h" #ifdef THINK_C #include "SPDProg.h" #include "SPDErrors.h" #include "SPDFiles.h" #include "SPDPStrings.h" #else /* THINK_C */ #include "errors.h" #ifndef _SPD_FILES_ # define cfopen(a,b) fopen((a),(b)) #endif # define CAlert(a) DoError( INPUT_ERR, WARN_ERR, "%s\n", (a)); #endif /* THINK_C */ static char get_string( unsigned char c, unsigned char modo, char *theString, FILE *RibFileIn ); void catrib( FILE *RibFileIn, FILE *RibFileOut); char err[256]; static char get_string( unsigned char c, unsigned char modo, char* theString, FILE* RibFileIn ) { unsigned short int w; unsigned char l; unsigned long int length; char done; int i; done=0; if (modo==M_UNKNOW) { if (IsUncodedStr(c)) { ungetc(c,RibFileIn); modo=M_UNCOD; } else if (IsShortStr(c)) modo=M_SHORT; else if (IsLongStr(c)) modo=M_LONG; } switch (modo) { case M_SHORT: w = ( unsigned short int ) c - S_SHORT_m; fread( (void*)theString, 1, (size_t) w , RibFileIn); theString[w]=0; break; case M_LONG: l = ( unsigned char ) c - S_LONG_m + 1; length=0; fread( (void*)&length, (size_t) l, 1 , RibFileIn); while(l++ < 4) length >>= 8; if (length>=LSMAX) { done = -1; break; } fread( (void*)theString, 1, (size_t) length , RibFileIn); theString[length]=0; break; case M_UNCOD: l=0; do{ if ( EOF==( i = getc(RibFileIn))) done=1; else if ( i > S_UNCOD_M ) done=2; else { theString[l++]=CopyChar(i); if ( l==LRIMAX-1 ) done = -3; } } while ( done==0 ); if (done!=2) break; else { done = 0; ungetc(i,RibFileIn); theString[l]='\0'; } break; default: done = -4; break; } return done; } /***********************************************************************/ void catrib( FILE *RibFileIn, FILE *RibFileOut) { int ctmp, i; char done=0; unsigned char c; unsigned short int d,w; unsigned short int token; unsigned char l; unsigned char code; unsigned long int length; long int FixedPoint; char ShortString[16]; char LongString[LSMAX]; float IEEEfloat; double IEEEdouble; static char RIrequest[256][LRIMAX]; static char** StringToken; static char* FPformat[]= { " %.0f"," %.3f"," %.5f"," %.8f" }; if (NULL==(StringToken=(char**)calloc(0XFFFF,sizeof(char*)))) done=-5; while((done==0)&&((ctmp=getc(RibFileIn))!=EOF)) { #ifdef _SPD_PROG_ SPDNow=(unsigned long int) RibFileIn->pos; SPDBackSysTask(kNiceBack,done);if (done==1) done = -7; #endif c=(unsigned char)ctmp; if (c<=C_ASCII) { /* ASCII characteres */ fputc(CopyChar(c),RibFileOut); continue; } else if (c<=C_Fixed) { /* integer or fixed-point */ c -= (C_ASCII + 1); d = ( unsigned short int ) ( c/4 ); w = ( unsigned short int ) c - d*4; FixedPoint=0; fread( (void*)&FixedPoint, (size_t) w+1 , 1, RibFileIn); while(w++ < 3) FixedPoint >>= 8; IEEEdouble=(double)FixedPoint / pow(256.0,d); fprintf(RibFileOut,FPformat[d], IEEEdouble ); continue; } else if (c<=C_ShortStr) { /* string of no more than 15 characteres */ done=get_string(c,M_SHORT, ShortString,RibFileIn); fprintf(RibFileOut," \"%s\"", ShortString); continue; } else if (c<=C_LongStr) { /* string of more than 15 characteres */ if( -1 == ( done = get_string( c,M_SHORT, LongString,RibFileIn))) break; fprintf(RibFileOut," \"%s\"", LongString); continue; } else if (c<=C_Float) { /* IEEE float */ fread( (void*)&IEEEfloat, 4 , 1 , RibFileIn); fprintf(RibFileOut," %f",IEEEfloat); continue; } else if (c<=C_Double) { /* IEEE double 8 bytes */ fread( (void*)&IEEEdouble, 8 , 1 , RibFileIn); *((long int*)((char*)&IEEEdouble+8))=0; fprintf(RibFileOut," %f",IEEEdouble); continue; } else if (c<=C_RiRequest) { /* RI request */ fread( (void*)&code, 1 , 1 , RibFileIn); fprintf(RibFileOut,"\n%s",RIrequest[code]); continue; } else if (c<=C_Reserved) { /* reserved */ continue; } else if (c<=C_Array) { /* single precision array */ l = ( unsigned char ) c - (C_Reserved +1); length=0; fread( (void*)&length, (size_t) l+1, 1 , RibFileIn); while(l++ < 3) length >>= 8; fprintf(RibFileOut," ["); while( length-- > 0 ) { fread( (void*)&IEEEfloat, 4 , 1 , RibFileIn); fprintf(RibFileOut," %f",IEEEfloat); } fprintf(RibFileOut," ]"); continue; } else if (c<=C_DefReq) { /* define encoded request */ fread( (void*)&code, 1 , 1 , RibFileIn); c=(unsigned char)getc(RibFileIn); done=get_string(c,M_UNKNOW,RIrequest[code],RibFileIn); continue; } else if (c<=C_DefStr) { /* define encoded string */ w=(unsigned short int)c-(C_DefReq+1); /* bytes/token */ token=0; fread( (void*)&token, (size_t)w+1 , 1 , RibFileIn); while(w++ < 1) token >>= 8; c=(unsigned char)getc(RibFileIn); if ( NULL==(StringToken[token]=(char*)malloc(LSMAX))) { done = -6; break; } done=get_string(c,M_UNKNOW,StringToken[token],RibFileIn); continue; } else if (c<=C_String) { /* interpolate defined string */ w=(unsigned short int)c-(C_DefStr+1); /* bytes/token */ token=0; fread( (void*)&token, (size_t)w+1 , 1 , RibFileIn); while(w++ < 1) token >>= 8; fprintf(RibFileOut," \"%s\"", StringToken[token]); continue; } else continue; /* reserved */ } switch(done) { case 0: case 1: sprintf(err,"No problem with drink"); break; case -1: sprintf(err,"Cadena demasiado larga"); break; case -2: sprintf(err,"def String demasiado largo"); break; case -3: sprintf(err,"Ri Request demasiado largo"); break; case -4: sprintf(err,"def String incorrecto"); break; case -5: case -6: sprintf(err,"Se acabo la memoria ( compra mas )"); break; case -7: sprintf(err,"Cancelado"); break; default: sprintf(err,"error raro"); break; } if(done!=-5) { token=0; do { if(StringToken[token]!=0) free(StringToken[token]); token++; }while( token != 0xFFFF ); if(StringToken!=0) free(StringToken); } #ifdef _SPD_PROG_ ReleaseMovableModal(); ReleaseAnimatedCursors(); #endif if (done<0) CAlert(err); }