135 lines
6.1 KiB
C
135 lines
6.1 KiB
C
/***********************************************************************/
|
|
/* */
|
|
/* Objective Caml */
|
|
/* */
|
|
/* Developed by Jacob Navia. */
|
|
/* Copyright 2001 Institut National de Recherche en Informatique et */
|
|
/* en Automatique. All rights reserved. This file is distributed */
|
|
/* under the terms of the GNU Library General Public License, with */
|
|
/* the special exception on linking described in file ../LICENSE. */
|
|
/* */
|
|
/***********************************************************************/
|
|
|
|
/* $Id$ */
|
|
|
|
/*------------------------------------------------------------------------
|
|
Module: D:\lcc\inria\inria.h
|
|
Author: Jacob
|
|
Project:
|
|
State:
|
|
Creation Date: June 2001
|
|
Description: The user interface works as follows:
|
|
1: At startup it will look for the path to the
|
|
ocaml interpreter in the registry using the
|
|
key HKEY_CURRENT_USER\SOFTWARE\ocaml. If not
|
|
found will prompt the user.
|
|
2: It will start the ocaml interpreter with
|
|
its standard output and standard input
|
|
connected to two pipes in a dedicated thread.
|
|
3: It will open a window containing an edit
|
|
field. The output from the interpreter will be
|
|
shown in the edit field, and the input of the
|
|
user in the edit field will be sent to the
|
|
interpreter when the user types return.
|
|
4: Line editing is provided by moving to the
|
|
desired line with the arrows, then pressing
|
|
return; If we aren't in the last input line,
|
|
the input will be copied to the last line and
|
|
sent to the interpreter.
|
|
5: The GUI ensures that when we exit the ocaml
|
|
interpreter is stopped by sending the
|
|
character string "#quit;;\nCtrl-Z"
|
|
6: A history of all lines sent to the interpreter
|
|
is maintained in a simple linked list. The
|
|
History dialog box shows that, and allows the
|
|
user to choose a given input line.
|
|
7: Memory limits. The edit buffer can be of an
|
|
arbitrary length, i.e. maybe 7-8MB or more,
|
|
there are no fixed limits. The History list
|
|
will always grow too, so memory consumption
|
|
could be "high" after several days of
|
|
uninterrupted typing at the keyboard. For that
|
|
cases it is recommended to stop the GUI and
|
|
get some sleep...
|
|
9: The GUI will start a timer, looking 4 times a
|
|
second if the interpreter has written
|
|
something in the pipe. This is enough for most
|
|
applications.
|
|
------------------------------------------------------------------------*/
|
|
#ifndef _INRIA_H_
|
|
#define _INRIA_H_
|
|
|
|
#include <windows.h>
|
|
#include "editbuffer.h"
|
|
#include "history.h"
|
|
|
|
#if _MSC_VER <= 1200
|
|
#define GetWindowLongPtr GetWindowLong
|
|
#define SetWindowLongPtr SetWindowLong
|
|
#define DWLP_USER DWL_USER
|
|
#define GWLP_WNDPROC GWL_WNDPROC
|
|
#define LONG_PTR DWORD
|
|
#endif
|
|
|
|
// In this structure should go eventually all global variables scattered
|
|
// through the program.
|
|
typedef struct _programParams {
|
|
HFONT hFont; // The handle of the current font
|
|
COLORREF TextColor; // The text color
|
|
char CurrentWorkingDir[MAX_PATH];// The current directory
|
|
} PROGRAM_PARAMS;
|
|
|
|
//**************** Global variables ***********************
|
|
extern PROGRAM_PARAMS ProgramParams;
|
|
|
|
extern COLORREF BackColor; // The background color
|
|
extern HBRUSH BackgroundBrush; // A brush built with the background color
|
|
extern char LibDir[]; // The lib directory
|
|
extern char OcamlPath[]; // The Path to ocaml.exe
|
|
extern HANDLE hInst; // The instance handle for this application
|
|
extern HWND hwndSession; // The current session window handle
|
|
extern LOGFONT CurrentFont; // The current font characteristics
|
|
extern HWND hwndMain,hwndMDIClient; // Window handles of frame and mdi window
|
|
|
|
// ***************** Function prototypes ******************
|
|
int WriteToPipe(char *data); // Writes to the pipe
|
|
int ReadFromPipe(char *data,int len);// Reads from the pipe
|
|
int AskYesOrNo(char *msg); //Ditto!
|
|
int BrowseForFile(char *fname,char *path);
|
|
void GotoEOF(void); // Positions the cursor at the end of the text
|
|
void ShowDbgMsg(char *msg); // Shows an error message
|
|
void HandleCommand(HWND hwnd, WPARAM wParam,LPARAM lParam);
|
|
int GetOcamlPath(void); // Finds where ocaml.exe is
|
|
void ForceRepaint(void); // Ditto.
|
|
void AddLineToControl(char *buf);
|
|
void AddStringToControl(char* buf);
|
|
char *GetHistoryLine(int n); // Gets the nth history line base 1.
|
|
int StartOcaml(void);
|
|
void InterruptOcaml(void);
|
|
int ResetText(void);
|
|
BOOL SendingFullCommand(void);
|
|
void RewriteCurrentEditBuffer(void);
|
|
void RefreshCurrentEditBuffer(void);
|
|
|
|
// **************** User defined window messages *************
|
|
#define WM_NEWLINE (WM_USER+6000)
|
|
#define WM_TIMERTICK (WM_USER+6001)
|
|
#define WM_QUITOCAML (WM_USER+6002)
|
|
#define WM_SYNTAXERROR (WM_USER+6003)
|
|
#define WM_UNBOUNDVAL (WM_USER+6004)
|
|
#define WM_ILLEGALCHAR (WM_USER+6005)
|
|
|
|
// ********************** Structures ***********************
|
|
typedef struct tagPosition {
|
|
int line;
|
|
int col;
|
|
} POSITION;
|
|
|
|
extern void *SafeMalloc(int);
|
|
extern StatementHistory *History; // The root of the history lines
|
|
extern StatementHistory *HistoryTail; // The tail of the history lines
|
|
extern EditBuffer *CurrentEditBuffer; // current edit buffer
|
|
|
|
#define IDEDITCONTROL 15432
|
|
#endif
|