int webclientReadResponse(int s, char* buf, int size) { int len, bodylen = 0; bool chunked = false; // read through the headers - figure out the content length scheme while ((len = tcpReadLine(s, webclientBuf, WEBCLIENT_BUFFER_SIZE))) { if (!strncasecmp(webclientBuf, "Content-Length", 14)) // check for content length bodylen = atoi(&webclientBuf[16]); else if (!strncasecmp(webclientBuf, "Transfer-Encoding: chunked", 26)) // check to see if we're chunked chunked = true; else if (strncmp(webclientBuf, "\r\n", 2) == 0) // final CRLF means end of headers break; } if (len <= 0) return 0; int content_read = 0; // read the actual response data into the caller's buffer, if there's any to grab if (chunked) { // first see if it's chunked int chunklen = 1; while (chunklen != 0 && content_read < size) { len = tcpReadLine(s, webclientBuf, WEBCLIENT_BUFFER_SIZE); if (siscanf(webclientBuf, "%x", &chunklen) != 1) // the first part of the chunk should indicate the chunk's length (hex) break; if (chunklen == 0) // an empty chunk indicates the end of the transfer break; if (chunklen > (size - content_read)) // make sure we have enough room to read this chunk, based on what we've already read chunklen = size - content_read; content_read += tcpRead(s, buf, chunklen); tcpReadLine(s, webclientBuf, WEBCLIENT_BUFFER_SIZE); // slurp out the remaining newlines } } // otherwise see if we got a content length else if (bodylen > 0) { while ((len = tcpRead(s, buf, size - content_read))) { content_read += len; buf += len; if (content_read >= bodylen) break; } } // lastly, just try to read until we get cut off else { while (content_read < size) { len = tcpRead(s, buf, size - content_read); if (len <= 0) break; content_read += len; buf += len; } } return content_read; }
struct ip_addr str2ip(const char* str) { int a,b,c,d; uint32_t ip = 0; if (siscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d) != 4) goto out; if (a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255) goto out; #if BYTE_ORDER == LITTLE_ENDIAN ip = (d << 24) | (c << 16) | (b << 8) | a; #else ip = (a << 24) | (b << 16) | (c << 8) | d; #endif out: return *(struct ip_addr*) &ip; }
//--------------------------------------------------------------------------------- ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { //--------------------------------------------------------------------------------- char chr; int i, count = 0; char *tmp = (char*)ptr; int intensity = 0; if(!tmp || len<=0) return -1; i = 0; while(*tmp!='\0' && i<len) { chr = *(tmp++); i++; count++; if ( chr == 0x1b && *tmp == '[' ) { bool escaping = true; char *escapeseq = tmp; int escapelen = 0; do { chr = *(tmp++); i++; count++; escapelen++; int parameter; switch (chr) { ///////////////////////////////////////// // Cursor directional movement ///////////////////////////////////////// case 'A': siscanf(escapeseq,"[%dA", ¶meter); currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter; escaping = false; break; case 'B': siscanf(escapeseq,"[%dB", ¶meter); currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; escaping = false; break; case 'C': siscanf(escapeseq,"[%dC", ¶meter); currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; escaping = false; break; case 'D': siscanf(escapeseq,"[%dD", ¶meter); currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; escaping = false; break; ///////////////////////////////////////// // Cursor position movement ///////////////////////////////////////// case 'H': case 'f': siscanf(escapeseq,"[%d;%df", ¤tConsole->cursorY , ¤tConsole->cursorX ); escaping = false; break; ///////////////////////////////////////// // Screen clear ///////////////////////////////////////// case 'J': consoleCls(escapeseq[escapelen-2]); escaping = false; break; ///////////////////////////////////////// // Line clear ///////////////////////////////////////// case 'K': consoleClearLine(escapeseq[escapelen-2]); escaping = false; break; ///////////////////////////////////////// // Save cursor position ///////////////////////////////////////// case 's': currentConsole->prevCursorX = currentConsole->cursorX ; currentConsole->prevCursorY = currentConsole->cursorY ; escaping = false; break; ///////////////////////////////////////// // Load cursor position ///////////////////////////////////////// case 'u': currentConsole->cursorX = currentConsole->prevCursorX ; currentConsole->cursorY = currentConsole->prevCursorY ; escaping = false; break; ///////////////////////////////////////// // Color scan codes ///////////////////////////////////////// case 'm': siscanf(escapeseq,"[%d;%dm", ¶meter, &intensity); //only handle 30-37,39 and intensity for the color changes parameter -= 30; //39 is the reset code if(parameter == 9){ parameter = 15; } else if(parameter > 8){ parameter -= 2; } else if(intensity){ parameter += 8; } if(parameter < 16 && parameter >= 0){ currentConsole->fontCurPal = parameter << 12; } escaping = false; break; } } while (escaping); continue; } consolePrintChar(chr); } return count; }
//--------------------------------------------------------------------------------- int con_write(struct _reent *r,int fd,const char *ptr,int len) { //--------------------------------------------------------------------------------- if (!consoleInitialised) return -1; char chr; int i, count = 0; char *tmp = (char*)ptr; if(!tmp || len<=0) return -1; i = 0; while(*tmp!='\0' && i<len) { chr = *(tmp++); i++; count++; if ( chr == 0x1b && *tmp == '[' ) { bool escaping = true; char *escapeseq = tmp; int escapelen = 0; do { chr = *(tmp++); i++; count++; escapelen++; int parameter; switch (chr) { ///////////////////////////////////////// // Cursor directional movement ///////////////////////////////////////// case 'A': siscanf(escapeseq,"[%dA", ¶meter); row = (row - parameter) < 0 ? 0 : row - parameter; escaping = false; break; case 'B': siscanf(escapeseq,"[%dB", ¶meter); row = (row + parameter) > CONSOLE_HEIGHT - 1 ? CONSOLE_HEIGHT - 1 : row + parameter; escaping = false; break; case 'C': siscanf(escapeseq,"[%dC", ¶meter); col = (col + parameter) > CONSOLE_WIDTH - 1 ? CONSOLE_WIDTH - 1 : col + parameter; escaping = false; break; case 'D': siscanf(escapeseq,"[%dC", ¶meter); col = (col - parameter) < 0 ? 0 : col - parameter; escaping = false; break; ///////////////////////////////////////// // Cursor position movement ///////////////////////////////////////// case 'H': case 'f': siscanf(escapeseq,"[%d;%df", &row, &col); escaping = false; break; ///////////////////////////////////////// // Screen clear ///////////////////////////////////////// case 'J': consoleCls(escapeseq[escapelen-2]); escaping = false; break; ///////////////////////////////////////// // Line clear ///////////////////////////////////////// case 'K': consoleClearLine(escapeseq[escapelen-2]); escaping = false; break; ///////////////////////////////////////// // Save cursor position ///////////////////////////////////////// case 's': savedX = col; savedY = row; escaping = false; break; ///////////////////////////////////////// // Load cursor position ///////////////////////////////////////// case 'u': col = savedX; row = savedY; escaping = false; break; } } while (escaping); continue; } consolePrintChar(chr); } return count; }
//--------------------------------------------------------------------------------- ssize_t con_write(struct _reent *r,void *fileStruct ,const char *ptr,size_t len) { //--------------------------------------------------------------------------------- char chr; if (!consoleInitialised) return -1; int i, count = 0; char *tmp = (char*)ptr; if(!tmp || len<=0) return -1; i = 0; while(*tmp!='\0' && i<len) { chr = *(tmp++); i++; count++; if ( chr == 0x1b && *tmp == '[' ) { bool escaping = true; char *escapeseq = tmp; int escapelen = 0; do { chr = *(tmp++); i++; count++; escapelen++; int parameter; switch (chr) { case 'H': siscanf(escapeseq,"[%d;%dH", &consoleY, &consoleX); escaping = false; break; case 'f': siscanf(escapeseq,"[%d;%df", &consoleY, &consoleX); escaping = false; break; case 'A': siscanf(escapeseq,"[%dA", ¶meter); consoleY = (consoleY - parameter) < 0 ? 0 : consoleY - parameter; escaping = false; break; case 'B': siscanf(escapeseq,"[%dB", ¶meter); consoleY = (consoleY + parameter) > CONSOLE_HEIGHT - 1 ? CONSOLE_HEIGHT - 1 : consoleY + parameter; escaping = false; break; case 'C': siscanf(escapeseq,"[%dC", ¶meter); consoleX = (consoleX + parameter) > CONSOLE_WIDTH - 1 ? CONSOLE_WIDTH - 1 : consoleX + parameter; escaping = false; break; case 'D': siscanf(escapeseq,"[%dC", ¶meter); consoleX = (consoleX - parameter) < 0 ? 0 : consoleX - parameter; escaping = false; break; case 'K': escaping = false; break; case 's': savedX = consoleX; savedY = consoleY; escaping = false; break; case 'u': consoleX = savedX; consoleY = savedY; escaping = false; break; case 'J': if ( escapeseq[escapelen-2] == '2') { consoleCls(); consoleX = 0; consoleY = 0; } escaping = false; break; } } while (escaping); continue; } consolePrintChar(chr); } return count; }