STATUS _minParse(char* inputBuffer, min_parser_data* result) { currentBuffer = inputBuffer; for (char i=0;i < MIN_PARSER_INTERNAL_BUFFER_SIZE;i++) { char c = inputBuffer[i]; switch(state) { case SEARCHING_HEADER: searchHeader(c); break; case SKIPPING_TIME: skipTime(c, i); break; case PARSING_STATUS: parseStatus(c, i); break; case PARSING_LAT_COORD: parseCoord(c, i, &(result->latCoord), PARSING_LAT_HEM); break; case PARSING_LAT_HEM: parseHem(c, i, &(result->latHem), PARSING_LONG_COORD); break; case PARSING_LONG_COORD: parseCoord(c, i, &(result->longCoord), PARSING_LONG_HEM); break; case PARSING_LONG_HEM: parseHem(c, i, &(result->longHem), DONE); break; case DONE: status = 1; break; default: state = SEARCHING_HEADER; break; } } memcpy(previousBuffer, currentBuffer, MIN_PARSER_INTERNAL_BUFFER_SIZE); return status; }
int main(){ int opt=0; int num,i,option; Pila *pila= loadHeaders(); while(opt==0){ //imprimir_pila(pila); printWelcomeMessage(); headerInput(pila); num = inputNumOfStudents(); for(i =0; i<num;i++){ inputScores(); } printf("\n\n"); system("cls"); printStadistics(); option = printOptionMenu(); switch(option){ case 1: searchHeader(pila); break; case 2: printf("\n\nHeaders: \n\n"); imprimir_pila(pila); system("PAUSE"); break; case 3: eliminateHeader(pila); break; } } system("PAUSE"); return 0; }
/* * return values: * < 0: error. * 0: success, connection still open. * 1: success, connection closed by server. * > 1: http response code if <200 or >300. */ static int processHTTPResponse( int sockfd, const char *contentType, PZ_BUF zBuf, FILE* fp) { int i, respCode, chunkLen, status = 0; char *te, *ct, *temp = NULL; // Receive the response from the server... // Get first line of header.. zBuf->length = 0; //ZError( DBG_MISC, "first recvNextLine..."); if (recvNextLine( sockfd, zBuf)<0) return -1; ZInfo4( DBG_MISC, "%s", zBuf->buf ); if (strncmp(zBuf->buf, "HTTP/", 5) ) { return(-1); } for (i=0; zBuf->buf[i] != ' '; i++) ; respCode = atoi(zBuf->buf + i); if (respCode < 200 || respCode >= 300) { ZError(DBG_MISC, "Received an invalid response code->%d", respCode); return(respCode); } //ZError( DBG_MISC, "second recvNextLine..."); // Get test of the header.. while (recvNextLine( sockfd, zBuf) > 2); ZInfo4(DBG_MISC, "HTTP Response Header->%s", zBuf->buf); if ((ct = searchHeader(zBuf->buf, "Content-Type: ", 14) )) { temp = strdup(ct); terminateLine(temp); } if (contentType) { if (temp) { char *cte = strchr(temp, ';'); if(cte) *cte = '\0'; if(matchContentType(temp, (char*)contentType) ) { ZError(DBG_MISC, "CONTENT-TYPE doesn't match. actual->%s, expected->%s", temp, contentType); free(temp); return(-1); } free(temp); } else { ZError(DBG_MISC, "CONTENT-TYPE doesn't match. actual->NULL, expected->%s", contentType); return(-1); } } status = searchHeader(zBuf->buf, "Connection: close", 17) || searchHeader(zBuf->buf, "Proxy-Connection: close", 23); if ((te = searchHeader(zBuf->buf, "Transfer-Encoding: ", 19)) ) terminateLine(te); if (te && !strcasecmp(te, "chunked")) { ZInfo4(DBG_MISC, "Processing chunked response"); zBuf->length = 0; // ZError( DBG_MISC, "first recvChunkedBody..."); recvChunkedBody( sockfd, zBuf, fp); } else { /* * if there is a Content-Length header field it will be in * decimal. */ if((te = searchHeader(zBuf->buf, "Content-Length: ", 16))) { ZInfo4(DBG_MISC, "Content-length present"); if( ! (chunkLen = strtol(te, 0, 10)) ) { ZError(DBG_MISC, "Unable to get chunkLen ->%s", te); return(-1); } // Reset length.. zBuf->length = 0; ZInfo4(DBG_MISC, "Processing receive with chunkLen->%d", chunkLen); recvChunk2( fp, sockfd, chunkLen); } else { /* * non-persistent connection, where close signals end * of data (i.e. 'Connection: close', * 'Proxy-Connection: close' or pre HTTP/1.1 server) */ // Reset length.. zBuf->length = 0; // ZError( DBG_MISC, "third recvChunk..."); while (recvChunk2( fp, sockfd, BUFSIZE) == BUFSIZE); status = 1; } } return status; }
int main(int argc, char **argv) { FILE *pIn, *pOut; size_t cbIn, cbOut; int fAdapterBios = 0; g_argv0 = argv[0]; if (argc != 3) return fatal("Input file name and output file name required.\n"); pIn = g_pIn = fopen(argv[1], "rb"); if (!pIn) return fatal("Error opening '%s' for reading (%s).\n", argv[1], strerror(errno)); pOut = g_pOut = fopen(argv[2], "wb"); if (!pOut) return fatal("Error opening '%s' for writing (%s).\n", argv[2], strerror(errno)); g_pszOutFile = argv[2]; /* safety precaution (aka. complete paranoia :-) */ memset(abBios, 0, sizeof(abBios)); cbIn = fread(abBios, 1, sizeof(abBios), pIn); if (ferror(pIn)) return fatal("Error reading from '%s' (%s).\n", argv[1], strerror(errno)); g_pIn = NULL; fclose(pIn); fAdapterBios = abBios[0] == 0x55 && abBios[1] == 0xaa; /* align size to page size */ if ((cbIn % 4096) != 0) cbIn = (cbIn + 4095) & ~4095; if (!fAdapterBios && cbIn != 64*1024) return fatal("Size of system BIOS is not 64KB!\n"); if (fAdapterBios) { /* adapter BIOS */ /* set the length indicator */ abBios[2] = (uint8_t)(cbIn / 512); } else { /* system BIOS */ size_t cbChecksum; uint8_t u8Checksum; uint8_t *pbHeader; /* Set the BIOS32 header checksum. */ switch (searchHeader(abBios, cbIn, "_32_", &pbHeader)) { case 0: return fatal("No BIOS32 header not found!\n"); case 2: return fatal("More than one BIOS32 header found!\n"); case 1: cbChecksum = (size_t)pbHeader[9] * 16; u8Checksum = calculateChecksum(pbHeader, cbChecksum, 10); pbHeader[10] = u8Checksum; break; } /* Set the PIR header checksum according to PCI IRQ Routing table * specification version 1.0, Microsoft Corporation, 1996 */ switch (searchHeader(abBios, cbIn, "$PIR", &pbHeader)) { case 0: return fatal("No PCI IRQ routing table found!\n"); case 2: return fatal("More than one PCI IRQ routing table found!\n"); case 1: cbChecksum = (size_t)pbHeader[6] + (size_t)pbHeader[7] * 256; u8Checksum = calculateChecksum(pbHeader, cbChecksum, 31); pbHeader[31] = u8Checksum; break; } /* Set the SMBIOS header checksum according to System Management BIOS * Reference Specification Version 2.5, DSP0134. */ switch (searchHeader(abBios, cbIn, "_SM_", &pbHeader)) { case 0: return fatal("No SMBIOS header found!\n"); case 2: return fatal("More than one SMBIOS header found!\n"); case 1: /* at first fix the DMI header starting at SMBIOS header offset 16 */ u8Checksum = calculateChecksum(pbHeader+16, 15, 5); pbHeader[21] = u8Checksum; /* now fix the checksum of the whole SMBIOS header */ cbChecksum = (size_t)pbHeader[5]; u8Checksum = calculateChecksum(pbHeader, cbChecksum, 4); pbHeader[4] = u8Checksum; break; } } /* set the BIOS checksum */ abBios[cbIn-1] = calculateChecksum(abBios, cbIn, cbIn - 1); cbOut = fwrite(abBios, 1, cbIn, pOut); if (ferror(pOut)) return fatal("Error writing to '%s' (%s).\n", g_pszOutFile, strerror(errno)); g_pOut = NULL; if (fclose(pOut)) return fatal("Error closing '%s' (%s).\n", g_pszOutFile, strerror(errno)); return 0; }