Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
public:valgrind [2014/08/31 00:35]
mpolednik
public:valgrind [2018/02/24 19:10] (aktuální)
Řádek 784: Řádek 784:
 } }
  
 +</​code>​
 +
 +==== In-memory pointry ====
 +<code C>
 +#include <​stdlib.h>​
 +#include <​string.h>​
 +#include <​stdio.h>​
 +#include <​assert.h>​
 +
 +#define REINIT_MSG_PTRS(msg) \
 +    do { \
 +        msg->​header = msg->​content;​ \
 +        msg->len = (int*)(msg->​header + strlen(msg->​header) + 1); \
 +        msg->​body = (char*)(msg->​len + 1); \
 +        msg->​tail = (msg->​body + strlen(msg->​body) + 1); \
 +        assert(msg->​tail == msg->​body + strlen(msg->​body) + 1); \
 +    } while (0)
 +
 +#define MSG_LEN \
 +    strlen(header) + 1 + sizeof(int) + strlen(body) + 1 + strlen(tail) + 1
 +
 +typedef struct _msg {
 +    char* content;
 +    char* header;
 +    int* len;
 +    char* body;
 +    char* tail;
 +} Msg_T;
 +
 +Msg_T*
 +msgCreate(const char* header, const char* body, const char* tail)
 +{
 +    Msg_T* msg = malloc(sizeof(Msg_T));​
 +    msg->​content = malloc(MSG_LEN);​
 +
 +    msg->​header = msg->​content;​
 +    strcpy(msg->​header,​ header);
 +
 +    msg->len = (int*)(msg->​header + strlen(msg->​header) + 1);
 +    *(msg->​len) = MSG_LEN;
 +
 +    msg->​body = (char*)(msg->​len + 1);
 +    strcpy(msg->​body,​ body);
 +    ​
 +    msg->​tail = (msg->​body + strlen(msg->​body) + 1);
 +    strcpy(msg->​tail,​ tail);
 +
 +    assert(strncmp(msg->​header,​ header, strlen(msg->​header)) == 0);
 +    assert(strncmp(msg->​body,​ body, strlen(msg->​body)) == 0);
 +    assert(strncmp(msg->​tail,​ tail, strlen(msg->​tail)) == 0);
 +    return msg;
 +}
 +
 +void
 +msgMoveTailBehindBody(Msg_T* msg, const char* body) 
 +{
 +    memmove(msg->​body + strlen(body) + 1, msg->​tail,​ strlen(msg->​tail) + 1);
 +    strcpy(msg->​body,​ body);
 +}
 +
 +void
 +msgChangeBody(Msg_T* msg, const char* body)
 +{
 +    *(msg->​len) += strlen(body) - strlen(msg->​body);​
 +
 +    if (strlen(body) > strlen(msg->​body)) {
 +        msg->​content = realloc(msg->​content,​ *(msg->​len));​
 +        REINIT_MSG_PTRS(msg);​
 +        msgMoveTailBehindBody(msg,​ body);
 +    } else {
 +        msgMoveTailBehindBody(msg,​ body);
 +        msg->​content = realloc(msg->​content,​ *(msg->​len));​
 +    }
 +
 +    REINIT_MSG_PTRS(msg);​
 +    assert(strncmp(msg->​body,​ body, strlen(msg->​body)) == 0);
 +}
 +
 +void*
 +msgFree(Msg_T* msg)
 +{
 +    free(msg->​content);​
 +    free(msg);
 +
 +    return NULL;
 +}
 +
 +void
 +msgVerify(Msg_T* msg, const char* header, int len, const char* body,
 +          const char* tail)
 +{
 +    assert(strncmp(msg->​header,​ header, strlen(msg->​header)) == 0);
 +    assert(*(msg->​len) == len);
 +    assert(strncmp(msg->​body,​ body, strlen(msg->​body)) == 0);
 +    assert(strncmp(msg->​tail,​ tail, strlen(msg->​tail)) == 0);
 +}
 +
 +int
 +main()
 +{
 +    Msg_T* msg = msgCreate("​hlavicka",​ "ahoj svete",​ "​ocasek"​);​
 +    msgVerify(msg,​ "​hlavicka",​ 31, "ahoj svete",​ "​ocasek"​);​
 +    msgChangeBody(msg,​ "delsi telicko zpravy nez ahoj svete"​);​
 +    msgVerify(msg,​ "​hlavicka",​ 56,
 +            "delsi telicko zpravy nez ahoj svete",​ "​ocasek"​);​
 +    msgChangeBody(msg,​ "​kratke telicko"​);​
 +    msgVerify(msg,​ "​hlavicka",​ 35, "​kratke telicko",​ "​ocasek"​);​
 +    msgChangeBody(msg,​ "a zase docela dlouhe telicko"​);​
 +    msgVerify(msg,​ "​hlavicka",​ 49, "a zase docela dlouhe telicko",​ "​ocasek"​);​
 +    msgChangeBody(msg,​ ":​)"​);​
 +    msgVerify(msg,​ "​hlavicka",​ 23, ":​)",​ "​ocasek"​);​
 +    msgFree(msg);​
 +}
 </​code>​ </​code>​
QR Code
QR Code public:valgrind (generated for current page)