common.h - clic - Clic is an command line interactive client for gopher written in Common LISP
 (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
       common.h (1703B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <stdint.h>
            4 #include <string.h>
            5 #include <inttypes.h>
            6 
            7 #ifndef offsetof
            8 #define offsetof(type, slot) ((long) ((char *) &(((type *) 0)->slot)))
            9 #endif
           10 #define getslot(type, slot) (((type *) 0)->slot)
           11 #define sizeofslot(type, slot) (sizeof(getslot(type, slot)))
           12 #define countofslot(type, slot) \
           13   (sizeof(getslot(type, slot)) / sizeof(getslot(type, slot)[0]))
           14 #define stringify(x) #x
           15 #define indirect_stringify(x) stringify(x)
           16 
           17 #define TYPE_SIGNED_P(type) (((type)-1)<0LL)
           18 #define _64_BIT_VALUE_FITS_SIGNED_P(value) ( (value) <= 0x7FFFFFFFFFFFFFFFLL )
           19 #define SLOT_SIGNED_P(result, type, slot)                                \
           20   do {                                                                         \
           21     type slot_signed_p_struct;                                                 \
           22     slot_signed_p_struct.slot = -1;                                         \
           23     (result) = slot_signed_p_struct.slot < 0;                                \
           24   } while (0)
           25 
           26 void type_name(FILE *output, int signed_p, int size) {
           27   if (signed_p) {
           28     switch (size) {
           29     case 1: fprintf(output, ":int8"); break;
           30     case 2: fprintf(output, ":int16"); break;
           31     case 4: fprintf(output, ":int32"); break;
           32     case 8: fprintf(output, ":int64"); break;
           33     default: goto error;
           34     }
           35   } else {
           36     switch(size) {
           37     case 1: fprintf(output, ":uint8"); break;
           38     case 2: fprintf(output, ":uint16"); break;
           39     case 4: fprintf(output, ":uint32"); break;
           40     case 8: fprintf(output, ":uint64"); break;
           41     default: goto error;
           42     }
           43   }
           44 
           45   return;
           46 
           47 error:
           48   fprintf(output, "(cl:error \"No type of size ~D.\" %i)\n", size);
           49 }
           50 
           51 char* print_double_for_lisp(double n)
           52 {
           53     static char buf[256];
           54     memset(buf, 0, 256);
           55     snprintf(buf, 255, "(let ((*read-default-float-format* 'double-float)) (coerce (read-from-string \"%.20E\") 'double-float))", n);
           56     return buf;
           57 }