/* * (c) SPDsoft 1994 * Strip QT header to get a (not always) valid JFIF * or do the reverse operation */ #include #include #include #include /* tolow */ #include /* tolow */ #ifdef THINK_C # include # define MAX_FNAME_L 256 #else # define MAX_FNAME_L 14 #endif #define SML 256 #ifndef SEEK_SET # define SEEK_SET 0 #endif #define tolow(c) (isupper(c) ? (c)-'A'+'a' : (c)) #define DoError(frm, str) fprintf(stderr,frm,app_name,str,'\n'); #define LONG_NAME 1 #define UNKNOW_SUFFIX 2 #define FORWARD 3 #define REVERSE 4 #define MAX_OFF 300 static char __ident[] = "@(#)(c) SPDsoft,6 julio 1994 vers 0.0"; #define VERS_STR ((char*)&__ident[4]) static int jgrow(char *iname, char *oname); static int jstrip(char *iname, char *oname); static int make_oname( char *name, char *suffix , char *osuffix); int main( int argc, char *argv[] ); char *app_name; int main( int argc, char *argv[] ) { int i; char iname[SML]; char oname[SML]; #ifdef THINK_C argc = ccommand(&argv); #endif app_name = argv[0]; if (argc == 1) { fprintf(stderr, "Use: %s [file.pict | file.jpg]\n%s\n", app_name, VERS_STR); exit(1); } for(i=1; iMAX_FNAME_L) return(LONG_NAME); p=name+strlen(name); while((*p!='.')&&(p>name)) { p--; *p = tolow(*p); } if(0==strcmp(++p,suffix)) { strcpy(p,osuffix); return(FORWARD); } else if(0==strcmp(p,osuffix)) { strcpy(p,suffix); return(REVERSE); } else return(UNKNOW_SUFFIX); } static int jstrip(char *iname, char *oname) { FILE *i_f, *o_f; char magic[3]={0xff, 0xd8, 0xff}; int bell, sz; char c[BUFSIZ], *p; if ((i_f=fopen(iname,"rb"))==NULL) DoError("%s: Can't open %s%c",iname); if (0!=fseek( i_f, 512L, SEEK_SET )) { fprintf(stderr, "%s: %s doesn't seem to be a QuickTime PICT (Header)\n", app_name, iname); fclose( i_f ); return -1; } if ( MAX_OFF != fread(c, 1, (size_t)MAX_OFF, i_f) ) { fprintf(stderr, "%s: %s doesn't seem to be a QuickTime PICT (Data)\n", app_name, iname); fclose( i_f ); return -2; } for ( p = c, sz = MAX_OFF, bell = 0; bell !=3 && sz > 3; p++ , sz --) { if (*p == magic[bell] ) bell ++; else bell = 0; } if ( bell != 3 ) { fprintf(stderr, "%s: %s doesn't seem to be a QuickTime PICT (Magic)\n", app_name, iname); fclose( i_f ); return -3; } if ((o_f=fopen(oname,"wb"))==NULL) DoError("%s: Can't open %s%c",oname); fwrite(p-3, (size_t)sz + 3, 1, o_f); while(!feof(i_f)) { sz = fread(c, 1, BUFSIZ, i_f); fwrite(c,(size_t)sz,1,o_f); } fclose(i_f); fclose(o_f); return 0; } static int jgrow(char *iname, char *oname) { FILE *i_f, *o_f; int bell, sz; char c[BUFSIZ], *p; unsigned short int QTHeader[]={ 0, 0, 0, 480, 239, 17, 767, 3072, 65534, 0, 72, 0, 72, 0, 0, 0, 480, 239, 0, 0, 1, 10, 0, 0, 480, 239, 33280, 0, 21184, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16384, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 480, 239, 0, 768, 0, 0, 0, 86, 27248, 25959, 0, 0, 0, 0, 1, 1, 24944, 28780, 0, 0, 0, 512, 239, 480, 72, 0, 72, 0, 0, 21030, 1, 3152, 26735, 29807, 8237, 8266, 20549, 18176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 65535 }; if ((i_f=fopen(iname,"rb"))==NULL) DoError("%s: Can't open %s%c",iname); if ((o_f=fopen(oname,"wb"))==NULL) DoError("%s: Can't open %s%c",oname); assert(sizeof(short int)==2); assert(BUFSIZ >= 512); memset(c, 0, (size_t)512); fwrite(c, (size_t)512 , 1, o_f); /* write qt header, 72 ppp */ /* Height */ QTHeader[3] = QTHeader[16] = QTHeader[24] = QTHeader[57] = QTHeader[80] = 480; /* Width */ QTHeader[4] = QTHeader[17] = QTHeader[25] = QTHeader[58] = QTHeader[79] = 640; /* fwrite(c, sizeof(QTHeader) , sizeof(short), o_f);*/ fwrite( QTHeader, sizeof(QTHeader) , 1, o_f); while(!feof(i_f)) { sz = fread(c, 1, BUFSIZ, i_f); fwrite(c,(size_t)sz,1,o_f); } fclose(i_f); fclose(o_f); return 0; }