00001
00002
00003
00004
00005
00006
00007
00008 # define HDR_MARK '\201'
00009
00010 # define CS_NIL ((char *)0)
00011
00012 struct str_hdr {
00013 char hdr_mark;
00014 char * first_part;
00015 char * last_part;
00016 };
00017
00018
00019
00020
00021
00022 static char charbuf[4];
00023
00024 # define is_empty(s) (*(s) == '\0')
00025
00026 # define GET_FIRST(s,c) \
00027 if (*s != HDR_MARK) { \
00028 c = *s; \
00029 } else { \
00030 charbuf[0] = '\0'; \
00031 str_firstn(charbuf, 1, s); \
00032 c = charbuf[0]; \
00033 }
00034
00035 # define GET_SECOND(s,c) \
00036 if (*s != HDR_MARK) { \
00037 c = s[1]; \
00038 } else { \
00039 charbuf[0] = '\0'; \
00040 str_firstn(charbuf, 2, s); \
00041 c = charbuf[1]; \
00042 }
00043
00044 # define GET_THIRD(s,c) \
00045 if (*s != HDR_MARK) { \
00046 c = s[2]; \
00047 } else { \
00048 charbuf[0] = '\0'; \
00049 str_firstn(charbuf, 3, s); \
00050 c = charbuf[2]; \
00051 }
00052
00053 char * concat();
00054
00055 char * flatten();
00056
00057 char * placeholder();
00058
00059 void set_ph();