Tcl Source Code

Artifact [9353a43696]
Login

Artifact 9353a436964c440c54a83e2ccfff7c40c3ae439318ddd5f70683500921f83c19:

Attachment "test-signed-tcl.c" to ticket [26f1328a86] added by anonymous 2022-01-12 13:01:28. (unpublished)
#include <stdio.h>

#define is_unsigned(n) ((n) >= 0 && ((n)-(n)-1) >= 0)

#define TclGetUInt1AtPtr(p) \
    ((unsigned int) *(p))

#define TclGetInt4AtPtr(p)                                              \
    (((int) (TclGetUInt1AtPtr(p) << 24)) |				\
		     (*((p)+1) << 16) |				\
		     (*((p)+2) <<  8) |				\
		     (*((p)+3)))

int
main (void) {
        // Baseline
        printf("12 -> U:%d\n", is_unsigned(12));
        printf("12U -> U:%d\n", is_unsigned(12U));
        printf("-12 -> U:%d\n", is_unsigned(-12));

        unsigned char * pc = (unsigned char*)main;

        unsigned char bytes[] = {0xFF,0xFF,0xFD,0xBC};
        printf("int(bytes): %d U:%d\n", TclGetInt4AtPtr(bytes),
               is_unsigned(TclGetInt4AtPtr(bytes)));

        printf("ptr: %p + int(bytes) -> %p (diff:%lld)\n",
               pc, pc + TclGetInt4AtPtr(bytes),
               (long long) ((pc + TclGetInt4AtPtr(bytes)) - pc));

        return 0;
}