summaryrefslogtreecommitdiff
path: root/sys/win/msvc/winfun.c
diff options
context:
space:
mode:
authorSteve M. Robbins <smr@debian.org>2011-10-22 04:54:51 +0200
committerSteve M. Robbins <smr@debian.org>2011-10-22 04:54:51 +0200
commitdd657ad3f1428b026486db3ec36691df17ddf515 (patch)
tree6ffb465595479fb5a76c1a6ea3ec992abaa8c1c1 /sys/win/msvc/winfun.c
Import nyquist_3.05.orig.tar.gz
[dgit import orig nyquist_3.05.orig.tar.gz]
Diffstat (limited to 'sys/win/msvc/winfun.c')
-rw-r--r--sys/win/msvc/winfun.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/sys/win/msvc/winfun.c b/sys/win/msvc/winfun.c
new file mode 100644
index 0000000..f1c4b9c
--- /dev/null
+++ b/sys/win/msvc/winfun.c
@@ -0,0 +1,276 @@
+/* winfun.c - windows user interface functions for xlisp */
+/* Written by Brian Kendig. */
+/*Windows Console and DirectSound code added by Morgan Green and Chris Tchou*/
+
+//#include <Quickdraw.h>
+//#include <Windows.h>
+//#include <Memory.h>
+#include <windows.h>
+#include <switches.h>
+#include "xlisp.h"
+#include "sound.h"
+
+/* Added by Ning Hu May.2001
+xsetdir - set current directory of the process */
+LVAL xsetdir() {
+ TCHAR ssCurDir[MAX_PATH], szCurDir[MAX_PATH];
+ int verbose = TRUE;
+
+ strcpy(ssCurDir, getstring(xlgastring()));
+ if (moreargs()) {
+ verbose = (xlgetarg() != NIL);
+ }
+ xllastarg();
+ if (SetCurrentDirectory(ssCurDir)) {
+ if (GetCurrentDirectory(
+ sizeof(szCurDir)/sizeof(TCHAR), szCurDir)) {
+ return cvstring(szCurDir);
+ /* create the result string
+ stdputstr("Current Directory: ");
+ stdputstr(szCurDir);
+ stdputstr("\n"); */
+ }
+ }
+ if (verbose) stdputstr("Directory Setting Error\n");
+
+ /* return nil on error*/
+ return NIL;
+}
+
+/* xget_temp_path -- get a path to create temp files */
+LVAL xget_temp_path()
+{
+ char *p;
+ char szDir[MAX_PATH];
+ char szDirLC[MAX_PATH];
+ int rslt = GetTempPath(MAX_PATH, szDir);
+ if (rslt > MAX_PATH || rslt <= 0) {
+ return cvstring("");
+ } else {
+ /* Vista apparently treats c:\windows with
+ * special semantics, so just don't allow
+ * GetTempPath to put us in c:\windows...
+ */
+ strcpy(szDirLC, szDir); /* convert to lower case */
+ for (p = szDirLC; *p; p++) {
+ *p = tolower(*p);
+ }
+ if (strstr(szDirLC, "c:\\windows")) {
+ /* c:\windows is bad. */
+ return cvstring("");
+ }
+ return cvstring(szDir);
+ }
+}
+
+//Updated End
+
+
+/* osbgetc - get a character from a binary file ====== added for console*/
+/* int osbgetc(fp) FILE *fp; {return (getc(fp));} */
+int osbgetc(FILE *fp)
+{
+ int c; c = (getc(fp));
+/* if (dbgflg) printf("osbgetc: got %d from FILE %x\n", c, fp); */
+ return c;
+}
+
+
+
+LVAL xsystem (V) { return NIL; }
+LVAL xgetkey (V) { return NIL; }
+
+
+void ossymbols()
+{
+ HWND mywin;
+#ifdef WIN32_SNAZZY_CONSOLE
+ HANDLE myhandle;
+ COORD winsize, origin;
+ WORD textattrib;
+ DWORD n;
+#endif
+ mywin = GetForegroundWindow();
+ SetConsoleTitle("Nyquist");
+
+#ifdef WIN32_SNAZZY_CONSOLE // -eub
+ myhandle = GetStdHandle(STD_OUTPUT_HANDLE);
+ origin.X = 0;
+ origin.Y = 0;
+ winsize.X = 100;
+ winsize.Y = 40;
+ textattrib = BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY;
+
+ FillConsoleOutputAttribute(myhandle, textattrib, winsize.X * winsize.Y, origin, &n);
+ SetConsoleScreenBufferSize(myhandle, winsize);
+ FillConsoleOutputAttribute(myhandle, textattrib, winsize.X * winsize.Y, origin, &n);
+ SetConsoleTextAttribute(myhandle, textattrib);
+#endif
+
+ setvbuf(stdout, NULL, _IONBF, 0); // makes it work under NT emacs 20.3 -eub
+
+}
+
+
+LVAL xsetupconsole()
+{
+ HWND mywin;
+ HANDLE myhandle;
+ COORD winsize, origin;
+ WORD textattrib;
+ DWORD n;
+ mywin = GetForegroundWindow();
+ SetConsoleTitle("Nyquist");
+
+ myhandle = GetStdHandle(STD_OUTPUT_HANDLE);
+ origin.X = 0;
+ origin.Y = 0;
+ winsize.X = 100;
+ winsize.Y = 40;
+ textattrib = BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY;
+
+ FillConsoleOutputAttribute(myhandle, textattrib, winsize.X * winsize.Y, origin, &n);
+ SetConsoleScreenBufferSize(myhandle, winsize);
+ FillConsoleOutputAttribute(myhandle, textattrib, winsize.X * winsize.Y, origin, &n);
+ SetConsoleTextAttribute(myhandle, textattrib);
+ return NIL;
+}
+
+void get_xlisp_path(char *p, long p_max)
+{
+ HKEY hkey;
+ DWORD dwType;
+ LVAL lval;
+ extern LVAL s_search_path;
+
+ *p = 0; /* for simplicity, we assume if !*p that path was not found */
+ /* therefore, no path is equivalent to an empty string path */
+
+ /* first, look for path in global variable *SEARCH-PATH* */
+ lval = getvalue(s_search_path);
+ if (lval && stringp(lval)) {
+ strncpy(p, getstring(lval), p_max);
+ p[p_max - 1] = 0; /* make sure string is terminated, even if truncated */
+ }
+ if (*p) return; /* we got search path, so don't look in registry */
+
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, KEY_READ, &hkey) !=
+ ERROR_SUCCESS) {
+ return;
+ }
+ if (RegOpenKeyEx(hkey, "CMU", 0, KEY_READ, &hkey) !=
+ ERROR_SUCCESS) {
+ return;
+ }
+ if (RegOpenKeyEx(hkey, "Nyquist", 0, KEY_READ, &hkey) !=
+ ERROR_SUCCESS) {
+ return;
+ }
+ if (RegQueryValueEx(hkey, "XLISPPATH", NULL, &dwType, p, &p_max) !=
+ ERROR_SUCCESS) {
+ *p = 0;
+ return;
+ }
+}
+
+LVAL xget_user()
+{
+ // not implemented for Windows, just use "nyquist"
+ return cvstring("nyquist");
+}
+
+
+#ifdef WINGUI
+/* NOTE: define WINGUI in the Project Settings for the NyqWin projects.
+ * Do not define WINGUI for console versions of Nyquist
+ */
+
+/****************************************************************************
+* fileopen
+* Inputs:
+* char *deflt: the default file name (e.g. from command line)
+* char *extension: default extension
+* char *mode: read ("r") or write ("w")
+* char *prompt: prompt for user
+* Returns:
+* opened file pointer
+* Effect:
+* opens file, prompts for user input if necessary and warns about
+* possible confusion. If deflt is a null string or NULL, the user will
+* be prompted for a name. The routine loops until a file is opened.
+* If the mode is "r", a check is made to see if the file exists
+* with and without the extension. If both exist a warning is given.
+* For mode "w", a check is made to see if the file will be overwritten.
+* The extension is automatically added if the default or user-typed
+* file has no "." At the bottom of the loop body, if no file has
+* been opened, the user is prompted for another file name.
+****************************************************************************/
+
+char fileopen_name[100]; /* name of the opened file */
+
+HINSTANCE hInst; /* current instance */
+HWND hMainWindow; /* main window handle */
+
+
+char *getfilename(char *deflt, char *extension, char *mode, char *prompt)
+{
+ char filter[64];
+ char *filter_ptr = NULL;
+ OPENFILENAME open_file_name;
+
+ if (extension && extension[0] == 0) extension = NULL;
+ if (strcmp(extension, "lsp") == 0) {
+ strcpy(filter, "Lisp files");
+ } else if (extension) {
+ sprintf(filter, "%s files", extension);
+ }
+ if (extension) {
+ sprintf(filter + strlen(filter), "%c*.%s%cAll files%c*.*%c",
+ 0, extension, 0, 0, 0);
+ filter_ptr = filter;
+ }
+ if (!deflt) deflt = ""; /* treat NULL as the empty string */
+ strcpy(fileopen_name, deflt);
+
+ open_file_name.lStructSize = sizeof(OPENFILENAME);
+ open_file_name.hwndOwner = hMainWindow;
+
+ open_file_name.hInstance = hInst;
+ open_file_name.lpstrFilter = filter_ptr;
+ open_file_name.lpstrCustomFilter = NULL;
+ open_file_name.nMaxCustFilter = 0;
+ open_file_name.nFilterIndex = 0;
+ open_file_name.lpstrFile = fileopen_name;
+ open_file_name.nMaxFile = 100;
+ open_file_name.lpstrFileTitle = NULL;
+ open_file_name.nMaxFileTitle = 0;
+ open_file_name.lpstrInitialDir = NULL;
+ open_file_name.lpstrTitle = prompt;
+ open_file_name.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
+ open_file_name.nFileOffset = 0;
+ open_file_name.nFileExtension = 0;
+ open_file_name.lpstrDefExt = extension;
+ open_file_name.lCustData = 0;
+ open_file_name.lpfnHook = 0;
+ open_file_name.lpTemplateName = 0;
+ if (((*mode == 'r') && GetOpenFileName(&open_file_name)) ||
+ ((*mode == 'w') && GetSaveFileName(&open_file_name))) {
+ return open_file_name.lpstrFile;
+ }
+ return NULL;
+}
+
+
+
+FILE *fileopen(char *deflt, char *extension, char *mode, char *prompt)
+{
+ FILE *fp = NULL; /* file corresponding to filename */
+ if (getfilename(deflt, extension, mode, prompt)) {
+ fp = fopen(fileopen_name, mode);
+ }
+ return fp;
+}
+
+#endif
+
+