//===-- ELWrapper.h ---------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#pragma once

#include <stdio.h>

// EditLine editor function return codes.
// For user-defined function interface
#define CC_NORM         0
#define CC_NEWLINE      1
#define CC_EOF          2
#define CC_ARGHACK      3
#define CC_REFRESH      4
#define CC_CURSOR       5
#define CC_ERROR        6
#define CC_FATAL        7
#define CC_REDISPLAY    8
#define CC_REFRESH_BEEP 9

// el_set/el_get parameters
#define EL_PROMPT        0    // , el_pfunc_t
#define EL_TERMINAL      1    // , const char *
#define EL_EDITOR        2    // , const char *
#define EL_SIGNAL        3    // , int);
#define EL_BIND          4    // , const char *, ..., NULL
#define EL_TELLTC        5    // , const char *, ..., NULL
#define EL_SETTC         6    // , const char *, ..., NULL
#define EL_ECHOTC        7    // , const char *, ..., NULL
#define EL_SETTY         8    // , const char *, ..., NULL
#define EL_ADDFN         9    // , const char *, const char *, el_func_t
#define EL_HIST          10   // , hist_fun_t, const char *
#define EL_EDITMODE      11   // , int
#define EL_RPROMPT       12   // , el_pfunc_t
#define EL_GETCFN        13   // , el_rfunc_t
#define EL_CLIENTDATA    14   // , void *
#define EL_UNBUFFERED    15   // , int
#define EL_PREP_TERM     16   // , int
#define EL_GETTC         17   // , const char *, ..., NULL
#define EL_GETFP         18   // , int, FILE **
#define EL_SETFP         19   // , int, FILE *
#define EL_REFRESH       20   // , void
#define EL_PROMPT_ESC	 21   // , prompt_func, Char);              set/get

#define EL_BUILTIN_GETCFN (NULL)

// history defines
#define H_FUNC           0    // , UTSL
#define H_SETSIZE        1    // , const int
#define H_GETSIZE        2    // , void
#define H_FIRST          3    // , void
#define H_LAST           4    // , void
#define H_PREV           5    // , void
#define H_NEXT           6    // , void
#define H_CURR           8    // , const int
#define H_SET            7    // , int
#define H_ADD            9    // , const char *
#define H_ENTER          10   // , const char *
#define H_APPEND         11   // , const char *
#define H_END            12   // , void
#define H_NEXT_STR       13   // , const char *
#define H_PREV_STR       14   // , const char *
#define H_NEXT_EVENT     15   // , const int
#define H_PREV_EVENT     16   // , const int
#define H_LOAD           17   // , const char *
#define H_SAVE           18   // , const char *
#define H_CLEAR          19   // , void
#define H_SETUNIQUE      20   // , int
#define H_GETUNIQUE      21   // , void
#define H_DEL            22   // , int

struct EditLine
{
};

struct LineInfo
{
    const char *buffer;
    const char *cursor;
    const char *lastchar;
};

struct History
{
};

struct HistEvent
{
    int         num;
    const char *str;
};

extern "C"
{
    // edit line API
    EditLine        *el_init     ( const char *, FILE *, FILE *, FILE * );
    const char      *el_gets     ( EditLine *, int * );
    int              el_set      ( EditLine *, int, ... );

    void             el_end      ( EditLine * );
    void             el_reset    ( EditLine * );
    int              el_getc     ( EditLine *, char * );
    void             el_push     ( EditLine *, const char * );
    void             el_beep     ( EditLine * );
    int              el_parse    ( EditLine *, int, const char ** );
    int              el_get      ( EditLine *, int, ... );
    int              el_source   ( EditLine *, const char * );
    void             el_resize   ( EditLine * );
    const LineInfo  *el_line     ( EditLine * );
    int              el_insertstr( EditLine *, const char * );
    void             el_deletestr( EditLine *, int );

    // history API
    History         *history_init( void );
    void             history_end ( History * );
    int              history     ( History *, HistEvent *, int, ... );
};