Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
/* -*-C-*- * gnuclient.c -- pbreton Thu Jan 25 1996 * * Client code to allow local and remote editing of files by GNU Emacs. * * This file is not part of GNU Emacs. * * Copying is permitted under those conditions described by the GNU * General Public License. * * Copyright (C) 1996 Peter Breton * * Author: Peter Breton (pbreton@cs.umb.edu) * Based heavily on Andy Norman's gnuserv (ange@hplb.hpl.hp.com), * which in turn was based on 'etc/emacsclient.c' from the GNU * Emacs 18.52 distribution. * * Modifications: Nico Francois (nico.francois@scala.nl) * Mon Jun 3 1996 * See comment in gnuserv.c. * * Modifications: Nico Francois (nico.francois@scala.nl) * Sun Sep 15 1996 * If WIN_VERSION is defined the -q (quick) flag is always turned on. * Will be defined when the client program is compiled and then linked * as a windows progranm. * * Modifications: Nico Francois (nico.francois@scala.nl) * Mon Oct 7 1996 * filename_expand() has been modified to always make sure it has the * long filename of a file. * * * $Log: gnuclient.c,v $ * Revision 1.1 1996/01/28 16:33:03 peter * Initial revision * */ static char rcsid [] = "$Header$"; #include "gnuserv.h" #include "getopt.h" /* Ascii codes in decimal */ #define FORWARD_SLASH 47 #define BACKWARD_SLASH 92 /* current working directory when calculated */ static char cwd[MAXPATHLEN+2]; /* ptr into valid bit of cwd above */ static char * cp = NULL; /* Name of this program */ static char * progname; /* * Returns the current working directory */ char * get_current_working_directory() { /* haven't calculated it yet */ if (cp == NULL) { if (0 == GetCurrentDirectory(MAXPATHLEN + 2, cwd)) { fprintf(stderr, "%s: unable to get current working directory\n", progname); exit(1); }; /* if */ }; /* if */ return cp; } /* get_current_working_directory */ /* * filename_expand -- try to convert the given filename into a * fully-qualified pathname. */ int filename_expand(fullpath, filename) char *fullpath; /* returned full pathname */ char *filename; /* filename to expand */ { WIN32_FIND_DATA finddata; HANDLE handle; char *p, *fname; if (0 == GetFullPathName (filename, MAXPATHLEN + 2, fullpath, &fname)) { fprintf(stderr, "Unable to get full pathname for %s\n", filename); return (0); } /* Backslashes confuse emacs */ for (p = fullpath; *p; p++) { if (BACKWARD_SLASH == *p) *p = FORWARD_SLASH; } /* Since GetFullPathName doesn't always seem to return the long filename (as documented) we get it ourselves. */ handle = FindFirstFile (filename, &finddata); if (handle == INVALID_HANDLE_VALUE) { fprintf(stderr, "Unable to get file info for %s\n", filename); return (0); } strcpy (fname, finddata.cFileName); FindClose (handle); return (1); } /* filename_expand */ void main(argc,argv) int argc; char *argv[]; { int starting_line = 1; /* line to start editing at */ char command[MAXPATHLEN+50]; /* emacs command buffer */ char fullpath[MAXPATHLEN+1]; /* full pathname to file */ char clientidstr[20]; int qflg = 0; /* quick edit */ int dbgflg = 0; /* debug flag */ int errflg = 0; /* option error */ int c; /* char from getopt */ HANDLE h; /* mailslot handle */ char * hostarg = GNUSERV_DEFAULT_HOST; /* hostname */ char * basecommand; HANDLE resultslot; DWORD clientid = GetCurrentProcessId(); BOOL noresult = FALSE; progname = argv[0]; #ifdef WIN_VERSION qflg++; #endif /* Parse arguments */ while ((c = getopt(argc, argv, "h:qd?" )) != EOF) switch (c) { case 'q': qflg++; break; case 'd': dbgflg++; break; case 'h': hostarg = optarg; // FIX! We don't support results from a server on another host just yet. noresult = TRUE; break; case '?': errflg++; }; /* Print a usage message and quit */ if (errflg) { fprintf(stderr, "usage: %s [-q] [-d] [-h hostname] [[+line] path] ...\n", progname); exit (1); }; /* if */ // First create mailslot to receive result resultslot = CreateGnuServSlot (TRUE, clientid); if (INVALID_HANDLE_VALUE == resultslot) exit (1); /* Try to connect to the mailslot. Dies on failure */ h = ConnectToMailslot (hostarg, FALSE, 0); if (INVALID_HANDLE_VALUE == h) exit (1); /* Send a lisp command... */ basecommand = (qflg) ? "(server-edit-files-quickly '(" : "(server-edit-files '("; sprintf (clientidstr, "C:%d ", clientid); if (!SendString (h, clientidstr)) exit (1); SendString (h, basecommand); if (dbgflg) printf(basecommand); /* ...followed by file names to the server process */ for (; optind < argc; optind++) { if (*argv[optind] == '+') starting_line = atoi(argv[optind]); else { if (filename_expand(fullpath,argv[optind])) { sprintf(command,"(%d . \"%s\")",starting_line, fullpath); SendString (h, command); if (dbgflg) printf(command); starting_line = 1; } } /* else */ } /* for */ /* Finish off the sexp and send an EOT */ SendString (h, "))"); SendString (h, EOT_STR); if (dbgflg) printf("))"); /* Disconnect */ DisconnectFromMailslot (h); // Now wait for result, then exit. if (!noresult) WaitForServerResult (resultslot, FALSE); DisconnectFromMailslot (resultslot); exit(0); } /* main */