static void extrmultipartdata(unsigned char *inbuf, char *partsep, formfield **fields, int maxcount,int *count) { formfield *temparray; formfield *tempfield; unsigned char *p; unsigned char *dstart, *dend; int i,len; temparray=(formfield *)malloc(maxcount*sizeof(formfield)); p=inbuf; *count=0; while(((p=skipsep(p, partsep))!=NULL) && (*count<maxcount)) { (*count)++; tempfield=&temparray[*count-1]; getfieldinfo(p,&tempfield->name, &tempfield->attr); // printf("f: %s<br>\n",tempfield->name); dstart=skippartheader(p); // printf("d: %c%c%c%c<br>\n",dstart[0],dstart[1],dstart[2],dstart[3]); dend=skipdata(dstart,partsep); len=dend-dstart; tempfield->len=len; tempfield->data=(unsigned char *)malloc(len+1); for(i=0; i<len; i++) tempfield->data[i]=dstart[i]; tempfield->data[len]=0; p=dend+2; } (*fields)=(formfield *)malloc((*count)*sizeof(formfield)); for(i=0; i<*count; i++) (*fields)[i]=temparray[i]; free(temparray); }
static int print_jfif() { int major, minor, density, x, y, r, tx, ty ; r = rb(1); if (r == -1) return -1; major = rb(1); if (major == -1) return -1; minor = rb(1); if (minor == -1) return -1; density = rb(1); if (density == -1) return -1; x = rb(1); if (x == -1) return -1; r = rb(1); if (r == -1) return -1; x = (x << 8) | r; y = rb(1); if (y == -1) return -1; r = rb(1); if (r == -1) return -1; y = (y << 8) | r; tx = rb(1); if (tx == -1) return -1; ty = rb(1); if (ty == -1) return -1; fprintf(stderr,"JFIF v%d.%d, dens %d, %dx%d, tn %dx%d\n", major, minor, density, x, y, tx, ty); return skipdata(tx * ty * 3,1); }
int main(int argc, char **argv) { int m, len; m = getmarker(); if (m != SOI) { fprintf(stderr,":unknown, aborting.\n"); return 1; } fprintf(stderr,":SOI\n"); while (1) { m = getmarker(); if (m == -1) { fprintf(stderr,":Error, end of file, aborting.\n"); break; } if (haslength(m)) len = getlength(); else len = 0; switch (m) { case COM: { char *comment; comment = malloc(len - 2 + 1); comment[len-2]='\0'; if (-1 == rd(len - 2, comment)) break; fprintf(stderr,":COM(%s)\n",comment); break; } case SOS: { int i,ns,ss,se,ahl,cs,td; ns = rb(1);if (ns == -1) break; fprintf(stderr,":SOS "); for (i=0;i<ns;i++) { cs = rb(1);if (cs == -1) break; td = rb(1);if (td == -1) break; fprintf(stderr,"[%d,%d:%d]",cs,(td>>4),td&0xf); } ss = rb(1); if (ss == -1) break; se = rb(1); if (se == -1) break; ahl = rb(1); if (ahl == -1) break; fprintf(stderr,"ss=%d, se=%d, h=%d,l=%d\n",ss,se,(ahl>>4),ahl&0xf); break; } case SOF0: { int bitcnt,x,y,nf,i,c,hv,tq; m = rb(1); if (m == -1) break; bitcnt = m; y = rb(1); if (y == -1) break; m = rb(1); if (m == -1) break; y = (y<<8) | m; x = rb(1); if (x == -1) break; m = rb(1); if (m == -1) break; x = (x<<8) | m; nf = rb(1); if (nf == -1) break; fprintf(stderr,":SOF0,bitcnt=%d,x=%d,y=%d:\n",bitcnt,x,y); for (i=0;i<nf;i++) { c = rb(1); if (c == -1) break; hv = rb(1); if (hv == -1) break; tq = rb(1); if (tq == -1) break; fprintf(stderr,"\t %02x = %d:%d, tq=%d\n",c,(hv>>4),hv&0xf,tq); } break; } case DHT: { m = rb(1); if (m == -1) break; fprintf(stderr,":DHT(0x%02x)\n",m); skipdata(len - 2 - 1,1); break; } case DQT: { fprintf(stderr,":DQT\n"); skipdata(len-2,1); break; } case APP1: case APP2: case APP0: { char name[5]; fprintf(stderr,":APP0("); if (-1==rd(4,name)) break; name[4] = '\0'; fprintf(stderr,"%s):", name); if (!strcmp(name,"JFIF")) { print_jfif(); } else { if (-1==skipdata(len - 2 - 4,0)) { break; } fprintf(stderr,"\n"); } break; } default: fprintf(stderr,":Unknown marker\n"); if (len) { if (-1==skipdata(len - 2,0)) { break; } fprintf(stderr,"\n"); } break; } } return 0; }