A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Revision:
61:aad055f1b0d1
Parent:
54:84ef2b29cf7e
Child:
79:f50e02fb5c94
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcp/tcpbuf.c	Thu Jan 11 17:38:21 2018 +0000
@@ -0,0 +1,90 @@
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "http.h"
+
+static int currentPositionInMessage;
+static int bufferPositionInMessage;
+static int bufferLength;
+static char* pBuffer;
+static char* p;
+
+static bool currentPositionIsInBuffer()
+{
+    return currentPositionInMessage >= bufferPositionInMessage && currentPositionInMessage < bufferPositionInMessage + bufferLength;
+}
+
+void TcpBufStart(int position, int mss, char *pData)
+{
+    currentPositionInMessage = 0;
+    bufferPositionInMessage = position;
+    bufferLength = mss;
+    pBuffer = pData;
+    p       = pData;
+}
+int TcpBufLength()
+{
+    return p - pBuffer;
+}
+
+void TcpBufAddChar(char c)
+{
+    if (currentPositionIsInBuffer()) *p++ = c;
+    currentPositionInMessage++;
+}
+void TcpBufFillChar(char c, int length)
+{
+    while (length > 0)
+    {
+        if (currentPositionIsInBuffer()) *p++ = c;
+        currentPositionInMessage++;
+        length--;
+    }
+}
+int TcpBufAddText(const char* text)
+{
+    const char* start = text;
+    while (*text)
+    {
+        if (currentPositionIsInBuffer()) *p++ = *text;
+        text++;
+        currentPositionInMessage++;
+    }
+    return text - start;
+}
+int TcpBufAddV(char *fmt, va_list argptr)
+{
+    int size  = vsnprintf(NULL, 0, fmt, argptr);  //Find the size required
+    char text[size + 1];                          //Allocate enough memory for the size required with an extra byte for the terminating null
+    vsprintf(text, fmt, argptr);                  //Fill the new buffer
+    return TcpBufAddText(text);                   //Add the text
+}
+int TcpBufAddF(char *fmt, ...)
+{
+    va_list argptr;
+    va_start(argptr, fmt);
+    int size = TcpBufAddV(fmt, argptr);
+    va_end(argptr);
+    return size;
+}
+void TcpBufAddData(const char* data, int length)
+{
+    while (length > 0)
+    {
+        if (currentPositionIsInBuffer()) *p++ = *data;
+        data++;
+        currentPositionInMessage++;
+        length--;
+    }
+}
+void TcpBufAddStream(void (*startFunction)(void), int (*enumerateFunction)(void))
+{
+    startFunction();
+    while (true)
+    {
+        int c = enumerateFunction();
+        if (c == EOF) break;
+        if (currentPositionIsInBuffer()) *p++ = c;
+        currentPositionInMessage++;
+    }
+}