/*
 * Console private definitions
 *
 * Copyright 2002 Eric Pouech
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef __WINE_CONSOLE_PRIVATE_H
#define __WINE_CONSOLE_PRIVATE_H

/* console.c */
extern int      CONSOLE_HandleCtrlC(unsigned) DECLSPEC_HIDDEN;
/* console.c */
extern int      CONSOLE_GetHistory(int idx, WCHAR* buf, int buf_len) DECLSPEC_HIDDEN;
extern BOOL     CONSOLE_AppendHistory(const WCHAR *p) DECLSPEC_HIDDEN;
extern unsigned CONSOLE_GetNumHistoryEntries(void) DECLSPEC_HIDDEN;
extern void     CONSOLE_FillLineUniform(HANDLE hConsoleOutput, int i, int j, int len, LPCHAR_INFO lpFill) DECLSPEC_HIDDEN;
extern BOOL     CONSOLE_GetEditionMode(HANDLE, int*) DECLSPEC_HIDDEN;

/* editline.c */
extern WCHAR*   CONSOLE_Readline(HANDLE, BOOL) DECLSPEC_HIDDEN;

/* term.c */
extern BOOL     TERM_Init(void) DECLSPEC_HIDDEN;
extern BOOL     TERM_Exit(void) DECLSPEC_HIDDEN;
extern unsigned TERM_FillSimpleChar(WCHAR real_inchar, INPUT_RECORD* ir) DECLSPEC_HIDDEN;
extern int      TERM_FillInputRecord(const char* in, size_t len, INPUT_RECORD* ir) DECLSPEC_HIDDEN;

#endif  /* __WINE_CONSOLE_PRIVATE_H */
