/*   -*- coding: utf-8 -*-  */

/***********************************************************************
*
*        Module   : Buffer
*        Fichier  : Buffer.h
*        Auteur   : J. DUCLOY
*        Date     : Juillet 93
*
************************************************************************/

#ifndef _DILIB_BUFFER_H
#define _DILIB_BUFFER_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct DilibBuffer
{
  char *buf;               /* buffer reel           */
  int  size;               /* taille buffer         */
  int  incr;               /* increment             */
  int length;              /* taille str dans buf   */
};

typedef struct  DilibBuffer Buffer;

struct BufferFormatMemoryStruct
{
  Buffer **bufArray;
  Buffer *result;
  char    escapeChar;
};

typedef struct BufferFormatMemoryStruct BufferFormatMemory;


char *BufferIncrement(Buffer *b1);
extern Buffer *BufferBuffer; 

/*      macros internes         */


#define BufferCatChar(b,c)     {                                \
           if (b->length >= b->size) BufferIncrement(b);     \
            b->buf[( b->length)++] = c;                      \
         }  ;      

#define BufferEndString(b)      {   \
      BufferCatChar(b,'\0');        \
      b->length--;                  \
      }

/*   macros externes   */

/* (deprecated)

#define BufferCharCat(b,c)               \
     {BufferCatChar(b,c);BufferEndString(b);}
 */
#define BufferSize(b1)   b1->size
#define BufferLen(b1)    b1->length
#define BufferString(b1) b1->buf
#define BufferCopy(b1,b2) (BufferStrcpy(b1,BufferString(b2)))
#define BufferCat(b1,b2)  (BufferStrcat(b1,BufferString(b2)))

/*                                   Fichier Buffer.c  */

Buffer*  BufferCreate(int sizeP, int incrementP);
#define  NewBuffer()    BufferCreate(20,10)
Buffer*  BufferFromString(char *s1);
char*    BufferFgetsUpTo(Buffer *b, FILE *s, int c);
char*    BufferStrcat(Buffer *b, char *s);
char*    BufferStrncat(Buffer *b, char *s, int n);
char*    BufferCharCat(Buffer *b1, unsigned char c1);
char*    BufferStrcpy(Buffer *b, char *s);
char*    BufferReset(Buffer *b1);
char*    BufferSave(Buffer *b1);
char*    BufferStrRepl(Buffer *b1, char *s1, char *s2);
char    *BufferStrncpy(Buffer *b, char *s, int n1);
void     BufferFree(Buffer *b1);
int      BufferInit();
Buffer  *BufferClone(Buffer *b1);
char    *BufferIntCat(Buffer *b1, int i1);
char    *BufferIntCpy(Buffer *b1, int i1);
char    *BufferDoubleCat(Buffer *b1, double d1, char *format);
char    *BufferTextCleanCat(Buffer *b, int mode, char *str);

char* BufferFgetsUpToTest(Buffer *b, FILE *s, int c);
char* BufferFgetsUpToEOF(Buffer *b, FILE *s);

char *BufferGetSubString(char *s1, int o1, int l1);
char *BufferGetIntString(char *s1);

#define  BufferGetsUpTo(b,c)    BufferFgetsUpTo(b,stdin,c)
#define  BufferFgets(b,s)       BufferFgetsUpTo(b,s,'\n')
#define  BufferGets(b)          BufferFgetsUpTo(b,stdin,'\n')

/*                                   Fichier BufferTail.c  */

int   BufferTailCmp(Buffer *b1, char *s1);
char *BufferTailCut(Buffer *b1, int n1);
char *BufferTailCutFromStr(Buffer *b1, char *s1);
char *BufferTailReplace(Buffer *b1, char *s1);

char *BufferAppendIsoDateOfTheDay(Buffer *b);
char *BufferAppendDirDateOfTheDay(Buffer *b);
char *BufferAppendDirFrenchDateOfTheDay(Buffer *b);
char *BufferAppendYearOfTheDay(Buffer *b);
char *BufferAppendDayOfTheDay(Buffer *b);
char *BufferAppendFrenchMonthOfTheDay(Buffer *b);
char *BufferAppendFrenchDateOfTheDay(Buffer *b);
char *BufferFrenchMonthOfTheDay();
char *BufferFrenchDateOfTheDay();
char *BufferDirFrenchDateOfTheDay();



/* suppr parmentf 11/10/2002 */
/* TODEL */
/* #define BufferSaveCat2(a,b)               \ */
/*   (((!BufferBuffer)?BufferInit():0),      \ */
/*    BufferStrcpy(BufferBuffer,(a)),        \ */
/*    BufferStrcat(BufferBuffer,(b)),        \ */
/*    BufferSave(BufferBuffer)) */

/*                              File BufferFormat.c  */

BufferFormatMemory* NewBufferFormatMemory();
char *BufferFormatMemorySet(BufferFormatMemory* mem1, char c1, char *str);
char *BufferFormatMemoryGet(BufferFormatMemory* mem1, char c1);
char *BufferFormatEval(BufferFormatMemory *mem1,  char *f1);

#endif /* _DILIB_BUFFER_H */

