📄 gvwgs.c
字号:
char *usage="Usage: gvwgs [/d] dllpath optionfile inputfile\n\
optionfile and inputfile will be deleted on exit\n\
It is intended that gvwgs be called with temporary files\n";
if (argc >= 2) {
if ( ((argv[1][0] == '/') || (argv[1][0] == '-')) &&
((argv[1][1] == 'd') || (argv[1][0] == 'D')) ) {
debug = 1;
sprintf(buf, "argv[0]=\042%s\042\n", argv[0]);
gs_addmess(buf);
sprintf(buf, "argv[1]=\042%s\042\n", argv[1]);
gs_addmess(buf);
sprintf(buf, "Shifting arguments\n");
gs_addmess(buf);
argv++;
argc--;
}
}
if (debug || (argc != 4)) {
int i;
sprintf(buf, "argc=%d\n", argc);
gs_addmess(buf);
for (i=0; i<argc; i++) {
sprintf(buf, "argv[%d]=\042%s\042\n", i, argv[i]);
gs_addmess(buf);
}
}
if (argc != 4) {
gs_addmess(usage);
return FALSE;
}
gsdllname = argv[1];
option = argv[2];
filename = argv[3];
if (debug) {
sprintf(buf, "multithread=%d\n", multithread);
gs_addmess(buf);
sprintf(buf, "gsdllname=\042%s\042\n", gsdllname);
gs_addmess(buf);
sprintf(buf, "option file=\042%s\042\n", option);
gs_addmess(buf);
sprintf(buf, "input file=\042%s\042\n", filename);
gs_addmess(buf);
}
if (debug) {
FILE *optfile = fopen(option, "r");
if (optfile == NULL) {
gs_addmess(usage);
sprintf(gsarg, "Can't find file '%s'\n", option);
gs_addmess(gsarg);
return FALSE;
}
sprintf(buf, "Option file contents:\n");
gs_addmess(buf);
while (fgets(buf, sizeof(buf)-1, optfile)) {
gs_addmess(" ");
gs_addmess(buf);
}
gs_addmess("\n");
fclose(optfile);
}
infile = fopen(filename, "rb");
if (infile == (FILE *)NULL) {
gs_addmess(usage);
sprintf(gsarg, "Can't find file '%s'\n", filename);
gs_addmess(gsarg);
return FALSE;
}
/* find length of file */
fseek(infile, 0L, SEEK_END);
lsize = ftell(infile);
lsize = lsize / 100; /* to get percent values */
if (lsize <= 0)
lsize = 1;
fseek(infile, 0L, SEEK_SET);
ldone = 0;
/* build options list */
strcpy(gsarg, "@");
strcat(gsarg, option);
gsarg[strlen(gsarg) + 1] = '\0';
return TRUE;
}
/* copyright dialog box */
BOOL CALLBACK _export
AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG:
SetDlgItemText(hDlg, ABOUT_VERSION, GSVIEW_DOT_VERSION);
return( TRUE);
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
EndDialog(hDlg, TRUE);
return(TRUE);
default:
return(FALSE);
}
default:
return(FALSE);
}
}
void
show_about(void)
{
DialogBoxParam( phInstance, "AboutDlgBox", hwnd_client, AboutDlgProc, (LPARAM)NULL);
}
/* display message */
int
message_box(char *str, int icon)
{
return MessageBox(hwnd_client, str, szAppName, icon | MB_OK);
}
void
saveas(void)
{
FILE *f;
OPENFILENAME ofn;
char szOFilename[256]; /* filename for OFN */
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd_client;
ofn.lpstrFile = szOFilename;
ofn.nMaxFile = sizeof(szOFilename);
ofn.Flags = OFN_PATHMUSTEXIST;
if (GetSaveFileName(&ofn)) {
if ((f = fopen(szOFilename, "wb")) == (FILE *)NULL) {
message_box("Can't create file", 0);
return;
}
fwrite(twbuf, 1, twend, f);
fclose(f);
}
return;
}
/*********************************************************************/
/* stdio functions */
static int GSDLLCALL
gsdll_stdin(void *instance, char *buf, int len)
{
char mess[MAXSTR];
sprintf(mess,"stdin callback not supported: %p %d\n", buf, len);
gs_addmess(mess);
return 0; /* EOF */
}
static int GSDLLCALL
gsdll_stdout(void *instance, const char *str, int len)
{
gs_addmess_count(str, len);
return len;
}
static int GSDLLCALL
gsdll_stderr(void *instance, const char *str, int len)
{
gs_addmess_count(str, len);
return len;
}
/* Poll the caller for cooperative multitasking. */
/* If this function is NULL, polling is not needed */
int GSDLLCALL gsdll_poll(void *handle)
{
if (!multithread) {
MSG msg;
if ((PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) != 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
/******************************************************************/
#ifndef ERROR_DLL_NOT_FOUND
#define ERROR_DLL_NOT_FOUND 1157L
#endif
/* display error message for LoadLibrary */
static void
load_library_error(HMODULE hmodule, const char *dllname)
{
char *text_reason;
char buf[MAXSTR+128];
int reason;
LPVOID lpMessageBuffer;
reason = GetLastError() & 0xffff;
switch (reason) {
case ERROR_FILE_NOT_FOUND: /* 2 */
text_reason = "File not found";
break;
case ERROR_PATH_NOT_FOUND: /* 3 */
text_reason = "Path not found";
break;
case ERROR_NOT_ENOUGH_MEMORY: /* 8 */
text_reason = "Not enough memory";
break;
case ERROR_BAD_FORMAT: /* 11 */
text_reason = "Bad EXE or DLL format";
break;
case ERROR_OUTOFMEMORY: /* 14 */
text_reason = "Out of memory";
break;
case ERROR_DLL_NOT_FOUND: /* 1157 */
text_reason = "DLL not found";
break;
default:
text_reason = (char *)NULL;
}
if (text_reason)
sprintf(buf, "Failed to load %s, error %d = %s\n", dllname, reason, text_reason);
else
sprintf(buf, "Failed to load %s, error %d\n", dllname, reason);
gs_addmess(buf);
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, reason,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* user default language */
(LPTSTR) &lpMessageBuffer, 0, NULL);
if (lpMessageBuffer) {
gs_addmess((LPTSTR)lpMessageBuffer);
gs_addmess("\r\n");
LocalFree(LocalHandle(lpMessageBuffer));
}
}
int
gsdll_open(GSDLL *dll, const char *name)
{
const char *shortname;
char fullname[MAX_PATH];
char *p;
if (debug)
gs_addmessf("Trying to load %s\n", name);
/* Try to load DLL first with given path */
dll->hmodule = LoadLibrary(name);
if (dll->hmodule < (HINSTANCE)HINSTANCE_ERROR) {
/* failed */
load_library_error(dll->hmodule, name);
/* try again, with path of EXE */
if ((shortname = strrchr((char *)name, '\\')) == (const char *)NULL)
shortname = name;
else
shortname++;
GetModuleFileName(phInstance, fullname, sizeof(fullname));
if ((p = strrchr(fullname,'\\')) != (char *)NULL)
p++;
else
p = fullname;
*p = '\0';
strcat(fullname, shortname);
if (debug)
gs_addmessf("Trying to load %s\n", fullname);
dll->hmodule = LoadLibrary(fullname);
if (gsdll.hmodule < (HINSTANCE)HINSTANCE_ERROR) {
/* failed again */
load_library_error(gsdll.hmodule, fullname);
/* try once more, this time on system search path */
if (debug)
gs_addmessf("Trying to load %s\n", shortname);
dll->hmodule = LoadLibrary(shortname);
if (dll->hmodule < (HINSTANCE)HINSTANCE_ERROR) {
/* failed again */
load_library_error(dll->hmodule, shortname);
}
}
}
if (dll->hmodule < (HINSTANCE)HINSTANCE_ERROR)
return_error(-1);
return 0;
}
int
gsdll_close(GSDLL *dll)
{
FreeLibrary(dll->hmodule);
return 0;
}
void *
gsdll_sym(GSDLL *dll, const char *name)
{
return GetProcAddress(dll->hmodule, name);
}
/*********************************************************************/
/* load GS DLL if not already loaded */
/* return TRUE if OK */
BOOL
gs_load_dll(void)
{
char buf[MAXSTR];
gsapi_revision_t rv;
int code;
int gs_argc;
char *gs_argv[3];
if (gsdll_load(&gsdll, gsdllname)) {
gs_addmess("Can't load Ghostscript DLL\n");
return FALSE;
}
gs_argv[0] = gsdllname;
gs_argv[1] = gsarg;
gs_argv[2] = NULL;
gs_argc = 2;
code = gsdll.new_instance(&gsdll.minst, NULL);
if (code) {
gs_addmessf("gsapi_new_instance returns %d\n", code);
gsdll_free(&gsdll);
return FALSE;
}
gsdll.set_stdio(gsdll.minst, gsdll_stdin, gsdll_stdout, gsdll_stderr);
gsdll.set_poll(gsdll.minst, gsdll_poll);
code = gsdll.init_with_args(gsdll.minst, gs_argc, gs_argv);
if (debug) {
sprintf(buf,"gsapi_init_with_args returns %d\n", code);
gs_addmess(buf);
}
if (code) {
gsdll_free(&gsdll);
return !code;
}
return !code;
}
/* Thread which loads Ghostscript DLL and sends input file to DLL */
#ifdef __BORLANDC__
#pragma argsused
#endif
void
gs_thread(void *arg)
{
char buf[MAXSTR];
int len;
int code;
int exit_code;
int error = 0;
if (!gs_load_dll())
return;
gsdll.run_string_begin(gsdll.minst, 0, &exit_code);
while ((len = fread(buf, 1, sizeof(buf), infile)) != 0) {
code = gsdll.run_string_continue(gsdll.minst, buf, len,
0, &exit_code);
if (code == e_NeedInput)
code = 0;
ldone += len;
if (pcdone != (int)(ldone / lsize)) {
pcdone = (int)(ldone / lsize);
PostMessage(hwnd_client, WM_PCUPDATE, (WPARAM)pcdone, 0);
}
if (code) {
error = 1;
sprintf(buf, "gsapi_execute_cont returns %d\n", code);
gs_addmess(buf);
break;
}
if (!multithread) {
MSG msg;
while ((PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) != 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
fclose(infile);
gsdll.run_string_end(gsdll.minst, 0, &exit_code);
code = gsdll.exit(gsdll.minst);
gs_addmessf("gsapi_exit returns %d\n", code);
gsdll_free(&gsdll);
/* tell main thread to shut down */
if ((code == 0) && (!error) && (!debug))
PostMessage(hwnd_client, WM_QUIT, 0, 0);
else
ShowWindow(hwnd_client, SW_SHOWNORMAL);
/*
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -