summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'psi/mkfilelt.cpp')
-rw-r--r--psi/mkfilelt.cpp368
1 files changed, 368 insertions, 0 deletions
diff --git a/psi/mkfilelt.cpp b/psi/mkfilelt.cpp
new file mode 100644
index 00000000..0d6aae55
--- /dev/null
+++ b/psi/mkfilelt.cpp
@@ -0,0 +1,368 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+//
+//
+// This is the setup program for Win32 GPL Ghostscript
+//
+// The starting point is a self extracting zip archive
+// with the following contents:
+// setupgs.exe
+// uninstgs.exe
+// filelist.txt (contains list of program files)
+// gs#.##\* (files listed in filelist.txt)
+// This is the same as the zip file created by Aladdin Enterprises,
+// with the addition of setupgs.exe, uninstgs.exe, and filelist.txt
+//
+// The first line of the file filelist.txt
+// contains the uninstall name to be used.
+// The second line contains name of the main directory where
+// uninstall log files are to be placed.
+// Subsequent lines contain files to be copied (but not directories).
+// For example, filelist.txt might contain:
+// GPL Ghostscript 8.55
+// gs8.55
+// gs8.55\bin\gsdll32.dll
+// gs8.55\lib\gs_init.ps
+//
+// The default install directory is c:\gs.
+// The default Start Menu Folder is Ghostscript.
+// These are set in the resources.
+// The setup program will create the following uninstall log files
+// c:\gs\gs#.##\uninstal.txt
+// The uninstall program (accessed through control panel) will not
+// remove directories nor will it remove itself.
+//
+// If the install directory is the same as the current file
+// location, no files will be copied, but the existence of each file
+// will be checked. This allows the archive to be unzipped, then
+// configured in its current location. Running the uninstall will not
+// remove uninstgs.exe, setupgs.exe, or filelist.txt.
+
+
+#define STRICT
+#include <windows.h>
+#include <shellapi.h>
+#include <objbase.h>
+#include <shlobj.h>
+#include <stdio.h>
+#include <direct.h>
+#include <ctype.h>
+
+#pragma comment(lib,"user32.lib")
+
+#ifdef MAX_PATH
+#define MAXSTR MAX_PATH
+#else
+#define MAXSTR 256
+#endif
+
+CHAR g_szAppName[MAXSTR];
+
+// Prototypes
+BOOL init();
+BOOL make_filelist(int argc, char *argv[]);
+
+
+//////////////////////////////////////////////////////////////////////
+// Entry point
+//////////////////////////////////////////////////////////////////////
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ strcpy(g_szAppName, "make_filelist");
+ if (!init()) {
+ MessageBox(HWND_DESKTOP, "Initialisation failed",
+ g_szAppName, MB_OK);
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////////
+// Initialisation and Main dialog box
+//////////////////////////////////////////////////////////////////////
+
+void
+message_box(const char *str)
+{
+ MessageBox(HWND_DESKTOP, str, g_szAppName, MB_OK);
+}
+
+
+BOOL
+init()
+{
+ DWORD dwVersion = GetVersion();
+ // get source directory
+
+
+ if (LOBYTE(LOWORD(dwVersion)) < 4) {
+ MessageBox(HWND_DESKTOP,
+ "This install program needs Windows 4.0 or later",
+ g_szAppName, MB_OK);
+ return FALSE;
+ }
+
+
+#define MAXCMDTOKENS 128
+
+ int argc;
+ LPSTR argv[MAXCMDTOKENS];
+ LPSTR p;
+ char *args;
+ char *d, *e;
+
+ p = GetCommandLine();
+
+ argc = 0;
+ args = (char *)malloc(lstrlen(p)+1);
+ if (args == (char *)NULL)
+ return 1;
+
+ // Parse command line handling quotes.
+ d = args;
+ while (*p) {
+ // for each argument
+
+ if (argc >= MAXCMDTOKENS - 1)
+ break;
+
+ e = d;
+ while ((*p) && (*p != ' ')) {
+ if (*p == '\042') {
+ // Remove quotes, skipping over embedded spaces.
+ // Doesn't handle embedded quotes.
+ p++;
+ while ((*p) && (*p != '\042'))
+ *d++ =*p++;
+ }
+ else
+ *d++ = *p;
+ if (*p)
+ p++;
+ }
+ *d++ = '\0';
+ argv[argc++] = e;
+
+ while ((*p) && (*p == ' '))
+ p++; // Skip over trailing spaces
+ }
+ argv[argc] = NULL;
+
+ if (argc > 2) {
+ // Probably creating filelist.txt
+ return make_filelist(argc, argv);
+ }
+ return 0;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Create file list
+//////////////////////////////////////////////////////////////////////
+
+FILE *fList;
+
+typedef int (*PFN_dodir)(const char *name);
+
+/* Called once for each directory */
+int
+dodir(const char *filename)
+{
+ return 0;
+}
+
+/* Called once for each file */
+int
+dofile(const char *filename)
+{
+ if (fList != (FILE *)NULL) {
+ fputs(filename, fList);
+ fputs("\n", fList);
+ }
+
+ return 0;
+}
+
+
+/* Walk through directory 'path', calling dodir() for given directory
+ * and dofile() for each file.
+ * If recurse=1, recurse into subdirectories, calling dodir() for
+ * each directory.
+ */
+int
+dirwalk(char *path, int recurse, PFN_dodir dodir, PFN_dodir dofile)
+{
+ WIN32_FIND_DATA find_data;
+ HANDLE find_handle;
+ char pattern[MAXSTR]; /* orig pattern + modified pattern */
+ char base[MAXSTR];
+ char name[MAXSTR];
+ BOOL bMore = TRUE;
+ char *p;
+
+
+ if (path) {
+ strcpy(pattern, path);
+ if (strlen(pattern) != 0) {
+ p = pattern + strlen(pattern) -1;
+ if (*p == '\\')
+ *p = '\0'; // truncate trailing backslash
+ }
+
+ strcpy(base, pattern);
+ if (strchr(base, '*') != NULL) {
+ // wildcard already included
+ // truncate it from the base path
+ if ( (p = strrchr(base, '\\')) != NULL )
+ *(++p) = '\0';
+ }
+ else if (isalpha(pattern[0]) &&
+ pattern[1]==':' && pattern[2]=='\0') {
+ strcat(pattern, "\\*"); // search entire disk
+ strcat(base, "\\");
+ }
+ else {
+ // wildcard NOT included
+ // check to see if path is a directory
+ find_handle = FindFirstFile(pattern, &find_data);
+ if (find_handle != INVALID_HANDLE_VALUE) {
+ FindClose(find_handle);
+ if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ strcat(pattern, "\\*"); // yes, search files
+ strcat(base, "\\");
+ }
+ else {
+ dofile(path); // no, return just this file
+ return 0;
+ }
+ }
+ else
+ return 1; // path invalid
+ }
+ }
+ else {
+ base[0] = '\0';
+ strcpy(pattern, "*");
+ }
+
+ find_handle = FindFirstFile(pattern, &find_data);
+ if (find_handle == INVALID_HANDLE_VALUE)
+ return 1;
+
+ while (bMore) {
+ strcpy(name, base);
+ strcat(name, find_data.cFileName);
+ if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ if ( strcmp(find_data.cFileName, ".") &&
+ strcmp(find_data.cFileName, "..") ) {
+ dodir(name);
+ if (recurse)
+ dirwalk(name, recurse, dodir, dofile);
+ }
+ }
+ else {
+ dofile(name);
+ }
+ bMore = FindNextFile(find_handle, &find_data);
+ }
+ FindClose(find_handle);
+
+ return 0;
+}
+
+
+
+// This is used when creating a file list.
+
+BOOL make_filelist(int argc, char *argv[])
+{
+ char *title = NULL;
+ char *dir = NULL;
+ char *list = NULL;
+ int i;
+
+ for (i=1; i<argc; i++) {
+ if (strcmp(argv[i], "-title") == 0) {
+ i++;
+ title = argv[i];
+ }
+ else if (strcmp(argv[i], "-dir") == 0) {
+ i++;
+ dir = argv[i];
+ }
+ else if (strcmp(argv[i], "-list") == 0) {
+ i++;
+ list = argv[i];
+ }
+ else {
+ if ((title == NULL) || (strlen(title) == 0) ||
+ (dir == NULL) || (strlen(dir) == 0) ||
+ (list == NULL) || (strlen(list) == 0)) {
+ message_box("Usage: make_filelist -title \042GPL Ghostscript #.##\042 -dir \042gs#.##\042 -list \042filelist.txt\042 spec1 spec2 specn\n");
+ return FALSE;
+ }
+ if (fList == (FILE *)NULL) {
+ if ( (fList = fopen(list, "w")) == (FILE *)NULL ) {
+ message_box("Can't write list file\n");
+ return FALSE;
+ }
+ fputs(title, fList);
+ fputs("\n", fList);
+ fputs(dir, fList);
+ fputs("\n", fList);
+ }
+ if (argv[i][0] == '@') {
+ // Use @filename with list of files/directories
+ // to avoid DOS command line limit
+ FILE *f;
+ char buf[MAXSTR];
+ int j;
+ if ( (f = fopen(&(argv[i][1]), "r")) != (FILE *)NULL) {
+ while (fgets(buf, sizeof(buf), f)) {
+ // remove trailing newline and spaces
+ while ( ((j = strlen(buf)-1) >= 0) &&
+ ((buf[j] == '\n') || (buf[j] == ' ')) )
+ buf[j] = '\0';
+ dirwalk(buf, TRUE, &dodir, &dofile);
+ }
+ fclose(f);
+ }
+ else {
+ wsprintf(buf, "Can't open @ file \042%s\042",
+ &argv[i][1]);
+ message_box(buf);
+ }
+ }
+ else
+ dirwalk(argv[i], TRUE, &dodir, &dofile);
+ }
+ }
+
+ if (fList != (FILE *)NULL) {
+ fclose(fList);
+ fList = NULL;
+ }
+ return TRUE;
+}
+