*/
+/* protect against double includes */
+#ifndef LIBCITADEL_H
+#define LIBCITADEL_H
+
+
/*
* since we reference time_t...
*/
#include <time.h>
#include <stdlib.h>
-#define LIBCITADEL_VERSION_NUMBER 112
+#include <stdarg.h>
+#define LIBCITADEL_VERSION_NUMBER 739
/*
* Here's a bunch of stupid magic to make the MIME parser portable.
#endif
+/* Logging levels - correspond to syslog(3) */
+enum LogLevel {
+ /* When about to exit the server for an unrecoverable error */
+ CTDL_EMERG, /* system is unusable */
+ /* Manual intervention is required to avoid an abnormal exit */
+ CTDL_ALERT, /* action must be taken immediately */
+ /* The server can continue to run with degraded functionality */
+ CTDL_CRIT, /* critical conditions */
+ /* An error occurs but the server continues to run normally */
+ CTDL_ERR, /* error conditions */
+ /* An abnormal condition was detected; server will continue normally */
+ CTDL_WARNING, /* warning conditions */
+ /* Normal messages (login/out, activity, etc.) */
+ CTDL_NOTICE, /* normal but significant condition */
+ /* Unimportant progress messages, etc. */
+ CTDL_INFO, /* informational */
+ /* Debugging messages */
+ CTDL_DEBUG /* debug-level messages */
+};
+
+
/*
* View definitions.
* Note that not all views are implemented in all clients.
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void (*PreMultiPartCallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void (*PostMultiPartCallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void *userdata,
int dont_decode
char *part_start, size_t length,
char *content_type, char *charset, char *encoding,
char *disposition,
+ char *id,
char *name, char *filename,
void (*CallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void (*PreMultiPartCallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void (*PostMultiPartCallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void *userdata,
int dont_decode
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void (*PreMultiPartCallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void (*PostMultiPartCallBack)
(char *cbname,
char *cbcharset,
size_t cblength,
char *cbencoding,
+ char *cbid,
void *cbuserdata),
void *userdata,
int dont_decode
);
-const char *GuessMimeType(char *data, size_t dlen);
+typedef struct StrBuf StrBuf;
+
+typedef struct _ConstStr {
+ const char *Key;
+ long len;
+}ConstStr;
+
+
+StrBuf* NewStrBuf(void);
+StrBuf* NewStrBufDup(const StrBuf *CopyMe);
+StrBuf* NewStrBufPlain(const char* ptr, int nChars);
+int StrBufPlain(StrBuf *Buf, const char* ptr, int nChars);
+StrBuf* _NewConstStrBuf(const char* StringConstant, size_t SizeOfStrConstant);
+#define NewConstStrBuf(a) _NewConstStrBuf(a, sizeof(a))
+void FreeStrBuf (StrBuf **FreeMe);
+void HFreeStrBuf (void *VFreeMe);
+int FlushStrBuf(StrBuf *buf);
+
+const char *ChrPtr(const StrBuf *Str);
+int StrLength(const StrBuf *Str);
+#define SKEY(a) ChrPtr(a), StrLength(a)
+long StrBufPeek(StrBuf *Buf, const char* ptr, long nThChar, char PeekValue);
+
+int StrBufTCP_read_line(StrBuf *buf, int *fd, int append, const char **Error);
+int StrBufReadBLOB(StrBuf *Buf, int *fd, int append, long nBytes, const char **Error);
+int StrBufTCP_read_buffered_line(StrBuf *Line,
+ StrBuf *buf,
+ int *fd,
+ int timeout,
+ int selectresolution,
+ const char **Error);
+
+int StrBufSipLine(StrBuf *LineBuf, StrBuf *Buf, const char **Ptr);
+int StrBufExtract_token(StrBuf *dest, const StrBuf *Source, int parmnum, char separator);
+int StrBufSub(StrBuf *dest, const StrBuf *Source, unsigned long Offset, size_t nChars);
+unsigned long StrBufExtract_unsigned_long(const StrBuf* Source, int parmnum, char separator);
+long StrBufExtract_long(const StrBuf* Source, int parmnum, char separator);
+int StrBufExtract_int(const StrBuf* Source, int parmnum, char separator);
+inline int StrBufNum_tokens(const StrBuf *source, char tok);
+int StrBufRemove_token(StrBuf *Source, int parmnum, char separator);
+
+void StrBufAppendBufPlain(StrBuf *Buf, const char *AppendBuf, long AppendSize, unsigned long Offset);
+void StrBufAppendBuf(StrBuf *Buf, const StrBuf *AppendBuf, unsigned long Offset);
+void StrBufAppendPrintf(StrBuf *Buf, const char *format, ...);
+#ifdef SHOW_ME_VAPPEND_PRINTF
+/* so owe don't create an include depndency, this is just visible on demand. */
+void StrBufVAppendPrintf(StrBuf *Buf, const char *format, va_list ap);
+#endif
+void StrBufPrintf(StrBuf *Buf, const char *format, ...) __attribute__((__format__(__printf__,2,3)));
+void StrBufCutLeft(StrBuf *Buf, int nChars);
+void StrBufCutRight(StrBuf *Buf, int nChars);
+void StrBufCutAt(StrBuf *Buf, int AfternChars, const char *At);
+void StrBufTrim(StrBuf *Buf);
+void StrBufUpCase(StrBuf *Buf);
+void StrBufLowerCase(StrBuf *Buf);
+void StrBufEUid_unescapize(StrBuf *target, const StrBuf *source);
+void StrBufEUid_escapize(StrBuf *target, const StrBuf *source);
+
+void StrBufReplaceChars(StrBuf *buf, char search, char replace);
+
+int CompressBuffer(StrBuf *Buf);
+void StrBufConvert(StrBuf *ConvertBuf, StrBuf *TmpBuf, void *pic);
+void ctdl_iconv_open(const char *tocode, const char *fromcode, void *pic);
+void StrBuf_RFC822_to_Utf8(StrBuf *Target, const StrBuf *DecodeMe, const StrBuf* DefaultCharset, StrBuf *FoundCharset);
+int StrBufDecodeBase64(StrBuf *Buf);
+int StrBufRFC2047encode(StrBuf **target, const StrBuf *source);
+#define LB (1) /* Internal escape chars */
+#define RB (2)
+#define QU (3)
+void StrBufUrlescAppend(StrBuf *OutBuf, const StrBuf *In, const char *PlainIn);
+long StrEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn, int nbsp, int nolinebreaks);
+void StrMsgEscAppend(StrBuf *Target, StrBuf *Source, const char *PlainIn);
+
+long StrTol(const StrBuf *Buf);
+int StrToi(const StrBuf *Buf);
+int StrBufIsNumber(const StrBuf *Buf);
+long StrBuf_Utf8StrLen(StrBuf *Buf);
+long StrBuf_Utf8StrCut(StrBuf *Buf, int maxlen);
+
+const char *GuessMimeType(const char *data, size_t dlen);
const char* GuessMimeByFilename(const char *what, size_t len);
/* Run once at Programstart */
int haschar(const char *st, int ch);
void remove_token(char *source, int parmnum, char separator);
void fmt_date(char *buf, size_t n, time_t thetime, int seconds);
-int is_msg_in_sequence_set(char *mset, long msgnum);
+int is_msg_in_sequence_set(const char *mset, long msgnum);
char *memreadline(char *start, char *buf, int maxlen);
char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen);
#define IsEmptyStr(a) ((a)[0] == '\0')
char *bmstrcasestr(char *text, char *pattern);
void CtdlMakeTempFileName(char *name, int len);
char *rfc2047encode(char *line, long length);
-int is_msg_in_mset(char *mset, long msgnum);
+int is_msg_in_mset(const char *mset, long msgnum);
int pattern2(char *search, char *patn);
void stripltlen(char *, int *);
char *html_to_ascii(char *inputmsg, int msglen, int screenwidth, int do_citaformat);
+void LoadEntityList(char *FileName);
char *vcard_serialize(struct vCard *);
void vcard_fn_to_n(char *vname, char *n, size_t vname_size);
void remove_charset_attribute(char *strbuf);
+long StrBufUnescape(StrBuf *Buf, int StripBlanks);
/*
* Hash list implementation for Citadel
*/
-#define HKEY(a) a, sizeof(a) - 1
+#define HKEY(a) a, (sizeof(a) - 1)
typedef struct HashList HashList;
typedef struct HashKey HashKey;
typedef void (*TransitionFunc) (void *Item1, void *Item2, int Odd);
typedef void (*PrintHashDataFunc) (const char *Key, void *Item, int Odd);
-HashList *NewHash(int Uniq, HashFunc F);
+int Flathash(const char *str, long len);
+#define IKEY(a) (const char*)(&((int)a)), sizeof(int)
+HashList *NewHash(int Uniq, HashFunc F);
void DeleteHash(HashList **Hash);
-
+void HDeleteHash(void *vHash);
int GetHash(HashList *Hash, const char *HKey, long HKLen, void **Data);
-
void Put(HashList *Hash, const char *HKey, long HKLen, void *Data, DeleteHashDataFunc DeleteIt);
-
int GetKey(HashList *Hash, char *HKey, long HKLen, void **Data);
-
int GetHashKeys(HashList *Hash, char ***List);
-
int dbg_PrintHash(HashList *Hash, PrintHashContent first, PrintHashContent Second);
-
-
int PrintHash(HashList *Hash, TransitionFunc Trans, PrintHashDataFunc PrintEntry);
-
-HashPos *GetNewHashPos(void);
-
+HashPos *GetNewHashPos(HashList *Hash, int StepWidth);
+int GetHashPosCounter(HashPos *At);
void DeleteHashPos(HashPos **DelMe);
-
-int GetNextHashPos(HashList *Hash, HashPos *At, long *HKLen, char **HashKey, void **Data);
-
+int GetNextHashPos(HashList *Hash, HashPos *At, long *HKLen, const char **HashKey, void **Data);
+int GetHashAt(HashList *Hash,long At, long *HKLen, const char **HashKey, void **Data);
void SortByHashKey(HashList *Hash, int Order);
void SortByHashKeyStr(HashList *Hash);
int GetCount(HashList *Hash);
const void *GetSearchPayload(const void *HashVoid);
void SortByPayload(HashList *Hash, CompareFunc SortBy);
+void generic_free_handler(void *ptr);
+void reference_free_handler(void *ptr);
+
void convert_spaces_to_underscores(char *str);
void vnote_free(struct vnote *v);
char *vnote_serialize(struct vnote *v);
void vnote_serialize_output_field(char *append_to, char *field, char *label);
+
+
+#endif // LIBCITADEL_H