Mercurial > hg > xemacs-beta
annotate lib-src/winclient.c @ 5492:e82f5b7010fe
Merge some stuff in man, fix up Makefile
-------------------- ChangeLog entries follow: --------------------
man/ChangeLog addition:
2010-02-19 Ben Wing <ben@xemacs.org>
* widget.texi:
* widget.texi (Top):
* widget.texi (Introduction):
* widget.texi (User Interface):
* widget.texi (Programming Example):
* widget.texi (Setting Up the Buffer):
* widget.texi (Basic Types):
* widget.texi (link):
* widget.texi (url-link):
* widget.texi (info-link):
* widget.texi (push-button):
* widget.texi (editable-field):
* widget.texi (text):
* widget.texi (menu-choice):
* widget.texi (radio-button-choice):
* widget.texi (item):
* widget.texi (choice-item):
* widget.texi (toggle):
* widget.texi (checkbox):
* widget.texi (checklist):
* widget.texi (editable-list):
* widget.texi (group):
* widget.texi (Sexp Types):
* widget.texi (constants):
* widget.texi (generic):
* widget.texi (atoms):
* widget.texi (composite):
* widget.texi (Widget Properties):
* widget.texi (Defining New Widgets):
* widget.texi (Widget Browser):
* widget.texi (Widget Minor Mode):
* widget.texi (Utilities):
* widget.texi (Widget Wishlist):
* widget.texi (Widget Internals):
* widget.texi (GNU Free Documentation License):
* widget.texi (Index):
Sync with FSF 23.1.92.
2010-02-19 Ben Wing <ben@xemacs.org>
* texinfo/fdl.texi: New file.
* texinfo/texinfo.texi:
* texinfo/texinfo.texi (Top):
* texinfo/texinfo.texi (Copying Conditions):
* texinfo/texinfo.texi (Overview):
* texinfo/texinfo.texi (Reporting Bugs):
* texinfo/texinfo.texi (Using Texinfo):
* texinfo/texinfo.texi (Output Formats):
* texinfo/texinfo.texi (Info Files):
* texinfo/texinfo.texi (Printed Books):
* texinfo/texinfo.texi (Formatting Commands):
* texinfo/texinfo.texi (Conventions):
* texinfo/texinfo.texi (Comments):
* texinfo/texinfo.texi (Minimum):
* texinfo/texinfo.texi (Six Parts):
* texinfo/texinfo.texi (Short Sample):
* texinfo/texinfo.texi (History):
* texinfo/texinfo.texi (Texinfo Mode):
* texinfo/texinfo.texi (Texinfo Mode Overview):
* texinfo/texinfo.texi (XEmacs Editing):
* texinfo/texinfo.texi (Inserting):
* texinfo/texinfo.texi (Showing the Structure):
* texinfo/texinfo.texi (Updating Nodes and Menus):
* texinfo/texinfo.texi (Updating Commands):
* texinfo/texinfo.texi (Updating Requirements):
* texinfo/texinfo.texi (Other Updating Commands):
* texinfo/texinfo.texi (Info Formatting):
* texinfo/texinfo.texi (Printing):
* texinfo/texinfo.texi (Texinfo Mode Summary):
* texinfo/texinfo.texi (Beginning a File):
* texinfo/texinfo.texi (Sample Beginning):
* texinfo/texinfo.texi (Texinfo File Header):
* texinfo/texinfo.texi (First Line):
* texinfo/texinfo.texi (Start of Header):
* texinfo/texinfo.texi (setfilename):
* texinfo/texinfo.texi (settitle):
* texinfo/texinfo.texi (End of Header):
* texinfo/texinfo.texi (Document Permissions):
* texinfo/texinfo.texi (copying):
* texinfo/texinfo.texi (insertcopying):
* texinfo/texinfo.texi (Titlepage & Copyright Page):
* texinfo/texinfo.texi (titlepage):
* texinfo/texinfo.texi (titlefont center sp):
* texinfo/texinfo.texi (title subtitle author):
* texinfo/texinfo.texi (Copyright):
* texinfo/texinfo.texi (end titlepage):
* texinfo/texinfo.texi (headings on off):
* texinfo/texinfo.texi (Contents):
* texinfo/texinfo.texi (The Top Node):
* texinfo/texinfo.texi (Top Node Example):
* texinfo/texinfo.texi (Master Menu Parts):
* texinfo/texinfo.texi (Global Document Commands):
* texinfo/texinfo.texi (documentdescription):
* texinfo/texinfo.texi (setchapternewpage):
* texinfo/texinfo.texi (paragraphindent):
* texinfo/texinfo.texi (firstparagraphindent):
* texinfo/texinfo.texi (exampleindent):
* texinfo/texinfo.texi (Software Copying Permissions):
* texinfo/texinfo.texi (Ending a File):
* texinfo/texinfo.texi (Printing Indices & Menus):
* texinfo/texinfo.texi (File End):
* texinfo/texinfo.texi (Structuring):
* texinfo/texinfo.texi (Tree Structuring):
* texinfo/texinfo.texi (Structuring Command Types):
* texinfo/texinfo.texi (makeinfo top):
* texinfo/texinfo.texi (chapter):
* texinfo/texinfo.texi (unnumbered & appendix):
* texinfo/texinfo.texi (majorheading & chapheading):
* texinfo/texinfo.texi (section):
* texinfo/texinfo.texi (unnumberedsec appendixsec heading):
* texinfo/texinfo.texi (subsection):
* texinfo/texinfo.texi (unnumberedsubsec appendixsubsec subheading):
* texinfo/texinfo.texi (subsubsection):
* texinfo/texinfo.texi (Raise/lower sections):
* texinfo/texinfo.texi (Nodes):
* texinfo/texinfo.texi (Two Paths):
* texinfo/texinfo.texi (Node Menu Illustration):
* texinfo/texinfo.texi (node):
* texinfo/texinfo.texi (Node Names):
* texinfo/texinfo.texi (Writing a Node):
* texinfo/texinfo.texi (Node Line Tips):
* texinfo/texinfo.texi (Node Line Requirements):
* texinfo/texinfo.texi (First Node):
* texinfo/texinfo.texi (makeinfo top command):
* texinfo/texinfo.texi (makeinfo Pointer Creation):
* texinfo/texinfo.texi (anchor):
* texinfo/texinfo.texi (Menus):
* texinfo/texinfo.texi (Menu Location):
* texinfo/texinfo.texi (Writing a Menu):
* texinfo/texinfo.texi (Menu Parts):
* texinfo/texinfo.texi (Less Cluttered Menu Entry):
* texinfo/texinfo.texi (Menu Example):
* texinfo/texinfo.texi (Other Info Files):
* texinfo/texinfo.texi (Cross References):
* texinfo/texinfo.texi (References):
* texinfo/texinfo.texi (Cross Reference Commands):
* texinfo/texinfo.texi (Cross Reference Parts):
* texinfo/texinfo.texi (xref):
* texinfo/texinfo.texi (Reference Syntax):
* texinfo/texinfo.texi (One Argument):
* texinfo/texinfo.texi (Two Arguments):
* texinfo/texinfo.texi (Three Arguments):
* texinfo/texinfo.texi (Four and Five Arguments):
* texinfo/texinfo.texi (Top Node Naming):
* texinfo/texinfo.texi (ref):
* texinfo/texinfo.texi (pxref):
* texinfo/texinfo.texi (inforef):
* texinfo/texinfo.texi (uref):
* texinfo/texinfo.texi (cite):
* texinfo/texinfo.texi (Marking Text):
* texinfo/texinfo.texi (Indicating):
* texinfo/texinfo.texi (Useful Highlighting):
* texinfo/texinfo.texi (code):
* texinfo/texinfo.texi (kbd):
* texinfo/texinfo.texi (key):
* texinfo/texinfo.texi (samp):
* texinfo/texinfo.texi (verb):
* texinfo/texinfo.texi (var):
* texinfo/texinfo.texi (env):
* texinfo/texinfo.texi (file):
* texinfo/texinfo.texi (command):
* texinfo/texinfo.texi (option):
* texinfo/texinfo.texi (dfn):
* texinfo/texinfo.texi (abbr):
* texinfo/texinfo.texi (acronym):
* texinfo/texinfo.texi (indicateurl):
* texinfo/texinfo.texi (email):
* texinfo/texinfo.texi (Emphasis):
* texinfo/texinfo.texi (emph & strong):
* texinfo/texinfo.texi (Smallcaps):
* texinfo/texinfo.texi (Fonts):
* texinfo/texinfo.texi (Quotations and Examples):
* texinfo/texinfo.texi (Block Enclosing Commands):
* texinfo/texinfo.texi (quotation):
* texinfo/texinfo.texi (example):
* texinfo/texinfo.texi (verbatim):
* texinfo/texinfo.texi (verbatiminclude):
* texinfo/texinfo.texi (lisp):
* texinfo/texinfo.texi (small):
* texinfo/texinfo.texi (display):
* texinfo/texinfo.texi (format):
* texinfo/texinfo.texi (exdent):
* texinfo/texinfo.texi (flushleft & flushright):
* texinfo/texinfo.texi (noindent):
* texinfo/texinfo.texi (indent):
* texinfo/texinfo.texi (cartouche):
* texinfo/texinfo.texi (Lists and Tables):
* texinfo/texinfo.texi (Introducing Lists):
* texinfo/texinfo.texi (itemize):
* texinfo/texinfo.texi (enumerate):
* texinfo/texinfo.texi (Two-column Tables):
* texinfo/texinfo.texi (table):
* texinfo/texinfo.texi (ftable vtable):
* texinfo/texinfo.texi (itemx):
* texinfo/texinfo.texi (Multi-column Tables):
* texinfo/texinfo.texi (Multitable Column Widths):
* texinfo/texinfo.texi (Multitable Rows):
* texinfo/texinfo.texi (Special Displays):
* texinfo/texinfo.texi (Floats):
* texinfo/texinfo.texi (float):
* texinfo/texinfo.texi (caption shortcaption):
* texinfo/texinfo.texi (listoffloats):
* texinfo/texinfo.texi (Images):
* texinfo/texinfo.texi (Image Syntax):
* texinfo/texinfo.texi (Image Scaling):
* texinfo/texinfo.texi (Footnotes):
* texinfo/texinfo.texi (Footnote Commands):
* texinfo/texinfo.texi (Footnote Styles):
* texinfo/texinfo.texi (Indices):
* texinfo/texinfo.texi (Index Entries):
* texinfo/texinfo.texi (Predefined Indices):
* texinfo/texinfo.texi (Indexing Commands):
* texinfo/texinfo.texi (Combining Indices):
* texinfo/texinfo.texi (syncodeindex):
* texinfo/texinfo.texi (synindex):
* texinfo/texinfo.texi (New Indices):
* texinfo/texinfo.texi (Insertions):
* texinfo/texinfo.texi (Atsign Braces Comma):
* texinfo/texinfo.texi (Inserting an Atsign):
* texinfo/texinfo.texi (Inserting Braces):
* texinfo/texinfo.texi (Inserting a Comma):
* texinfo/texinfo.texi (Inserting Quote Characters):
* texinfo/texinfo.texi (Inserting Space):
* texinfo/texinfo.texi (Not Ending a Sentence):
* texinfo/texinfo.texi (Ending a Sentence):
* texinfo/texinfo.texi (Multiple Spaces):
* texinfo/texinfo.texi (frenchspacing):
* texinfo/texinfo.texi (dmn):
* texinfo/texinfo.texi (Inserting Accents):
* texinfo/texinfo.texi (Inserting Quotation Marks):
* texinfo/texinfo.texi (Dots Bullets):
* texinfo/texinfo.texi (dots):
* texinfo/texinfo.texi (bullet):
* texinfo/texinfo.texi (TeX and copyright):
* texinfo/texinfo.texi (tex):
* texinfo/texinfo.texi (copyright symbol):
* texinfo/texinfo.texi (registered symbol):
* texinfo/texinfo.texi (euro):
* texinfo/texinfo.texi (pounds):
* texinfo/texinfo.texi (textdegree):
* texinfo/texinfo.texi (minus):
* texinfo/texinfo.texi (geq leq):
* texinfo/texinfo.texi (math):
* texinfo/texinfo.texi (Click Sequences):
* texinfo/texinfo.texi (Glyphs):
* texinfo/texinfo.texi (Glyphs Summary):
* texinfo/texinfo.texi (result):
* texinfo/texinfo.texi (expansion):
* texinfo/texinfo.texi (Print Glyph):
* texinfo/texinfo.texi (Error Glyph):
* texinfo/texinfo.texi (Equivalence):
* texinfo/texinfo.texi (Point Glyph):
* texinfo/texinfo.texi (Breaks):
* texinfo/texinfo.texi (Break Commands):
* texinfo/texinfo.texi (Line Breaks):
* texinfo/texinfo.texi (- and hyphenation):
* texinfo/texinfo.texi (allowcodebreaks):
* texinfo/texinfo.texi (w):
* texinfo/texinfo.texi (tie):
* texinfo/texinfo.texi (sp):
* texinfo/texinfo.texi (page):
* texinfo/texinfo.texi (group):
* texinfo/texinfo.texi (need):
* texinfo/texinfo.texi (Definition Commands):
* texinfo/texinfo.texi (Def Cmd Template):
* texinfo/texinfo.texi (Def Cmd Continuation Lines):
* texinfo/texinfo.texi (Optional Arguments):
* texinfo/texinfo.texi (deffnx):
* texinfo/texinfo.texi (Def Cmds in Detail):
* texinfo/texinfo.texi (Functions Commands):
* texinfo/texinfo.texi (Variables Commands):
* texinfo/texinfo.texi (Typed Functions):
* texinfo/texinfo.texi (Typed Variables):
* texinfo/texinfo.texi (Data Types):
* texinfo/texinfo.texi (Abstract Objects):
* texinfo/texinfo.texi (Object-Oriented Variables):
* texinfo/texinfo.texi (Object-Oriented Methods):
* texinfo/texinfo.texi (Defining Macros):
* texinfo/texinfo.texi (Invoking Macros):
* texinfo/texinfo.texi (Macro Details):
* texinfo/texinfo.texi (alias):
* texinfo/texinfo.texi (definfoenclose):
* texinfo/texinfo.texi (Hardcopy):
* texinfo/texinfo.texi (Use TeX):
* texinfo/texinfo.texi (Format with tex/texindex):
* texinfo/texinfo.texi (Format with texi2dvi):
* texinfo/texinfo.texi (Print with lpr):
* texinfo/texinfo.texi (Within XEmacs):
* texinfo/texinfo.texi (Texinfo Mode Printing):
* texinfo/texinfo.texi (Compile-Command):
* texinfo/texinfo.texi (Requirements Summary):
* texinfo/texinfo.texi (Preparing for TeX):
* texinfo/texinfo.texi (Overfull hboxes):
* texinfo/texinfo.texi (smallbook):
* texinfo/texinfo.texi (A4 Paper):
* texinfo/texinfo.texi (pagesizes):
* texinfo/texinfo.texi (Cropmarks and Magnification):
* texinfo/texinfo.texi (PDF Output):
* texinfo/texinfo.texi (Obtaining TeX):
* texinfo/texinfo.texi (Creating and Installing Info Files):
* texinfo/texinfo.texi (Creating an Info File):
* texinfo/texinfo.texi (makeinfo advantages):
* texinfo/texinfo.texi (Invoking makeinfo):
* texinfo/texinfo.texi (makeinfo options):
* texinfo/texinfo.texi (Pointer Validation):
* texinfo/texinfo.texi (makeinfo in XEmacs):
* texinfo/texinfo.texi (texinfo-format commands):
* texinfo/texinfo.texi (Batch Formatting):
* texinfo/texinfo.texi (Tag and Split Files):
* texinfo/texinfo.texi (Installing an Info File):
* texinfo/texinfo.texi (Directory File):
* texinfo/texinfo.texi (New Info File):
* texinfo/texinfo.texi (Other Info Directories):
* texinfo/texinfo.texi (Installing Dir Entries):
* texinfo/texinfo.texi (Invoking install-info):
* texinfo/texinfo.texi (Generating HTML):
* texinfo/texinfo.texi (HTML Translation):
* texinfo/texinfo.texi (HTML Splitting):
* texinfo/texinfo.texi (HTML CSS):
* texinfo/texinfo.texi (HTML Xref):
* texinfo/texinfo.texi (HTML Xref Link Basics):
* texinfo/texinfo.texi (HTML Xref Node Name Expansion):
* texinfo/texinfo.texi (HTML Xref Command Expansion):
* texinfo/texinfo.texi (HTML Xref 8-bit Character Expansion):
* texinfo/texinfo.texi (HTML Xref Mismatch):
* texinfo/texinfo.texi (Command List):
* texinfo/texinfo.texi (Command Syntax):
* texinfo/texinfo.texi (Tips):
* texinfo/texinfo.texi (Sample Texinfo Files):
* texinfo/texinfo.texi (Short Sample Texinfo File):
* texinfo/texinfo.texi (GNU Sample Texts):
* texinfo/texinfo.texi (Invoking sample):
* texinfo/texinfo.texi (GNU Free Documentation License):
* texinfo/texinfo.texi (Index):
* texinfo/texinfo.texi (Verbatim Copying License):
* texinfo/texinfo.texi (All-permissive Copying License):
* texinfo/texinfo.texi (Include Files):
* texinfo/texinfo.texi (Using Include Files):
* texinfo/texinfo.texi (texinfo-multiple-files-update):
* texinfo/texinfo.texi (Include Files Requirements):
* texinfo/texinfo.texi (Sample Include File):
* texinfo/texinfo.texi (Include Files Evolution):
* texinfo/texinfo.texi (Headings):
* texinfo/texinfo.texi (Headings Introduced):
* texinfo/texinfo.texi (Heading Format):
* texinfo/texinfo.texi (Heading Choice):
* texinfo/texinfo.texi (Custom Headings):
* texinfo/texinfo.texi (Catching Mistakes):
* texinfo/texinfo.texi (makeinfo Preferred):
* texinfo/texinfo.texi (Debugging with Info):
* texinfo/texinfo.texi (Debugging with TeX):
* texinfo/texinfo.texi (Using texinfo-show-structure):
* texinfo/texinfo.texi (Using occur):
* texinfo/texinfo.texi (Running Info-Validate):
* texinfo/texinfo.texi (Using Info-validate):
* texinfo/texinfo.texi (Unsplit):
* texinfo/texinfo.texi (Tagifying):
* texinfo/texinfo.texi (Splitting):
* texinfo/texinfo.texi (Refilling Paragraphs):
* texinfo/texinfo.texi (Command and Variable Index):
* texinfo/texinfo.texi (General Index):
* texinfo/version.texi: New file.
Sync with FSF 23.1.92. Make new directory to hold the files needed
to generate texinfo.info, since there are three such files now.
2010-02-19 Ben Wing <ben@xemacs.org>
* Makefile:
* Makefile (src_files1):
* Makefile (DIR):
* Makefile (texinfo-srcs):
* Makefile ($(INFODIR)/widget.info):
* Makefile ($(INFODIR)/texinfo.info):
* Makefile (.PHONY):
* Makefile (texinfo.dvi):
* Makefile (texinfo.pdf):
* Makefile ($(HTMLDIR)/widget.html):
* Makefile ($(HTMLDIR)/texinfo.html):
Incorporate texinfo.texi moving to a subdirectory texinfo/.
Do some tricks to reduce the amount of duplication while still
maintaining compatible with non-GNU make (at least, with
Solaris make).
* doclicense.texi: New file.
* info.texi:
* info.texi (Top):
* info.texi (Getting Started):
* info.texi (Help-Small-Screen):
* info.texi (Help):
* info.texi (Help-P):
* info.texi (Help-^L):
* info.texi (Help-Inv):
* info.texi (Help-]):
* info.texi (Help-M):
* info.texi (Help-FOO):
* info.texi (Help-Xref):
* info.texi (Help-Int):
* info.texi (Help-Q):
* info.texi (Advanced):
* info.texi (Search Text):
* info.texi (Search Index):
* info.texi (Go to node):
* info.texi (Choose menu subtopic):
* info.texi (Create Info buffer):
* info.texi (XEmacs Info Variables):
* info.texi (Expert Info):
* info.texi (Add):
* info.texi (Menus):
* info.texi (Cross-refs):
* info.texi (Help-Cross):
* info.texi (Tags):
* info.texi (Checking):
* info.texi (Index):
* texinfo.tex:
* texinfo.tex (paragraphindent{%):
* texinfo.tex (sectionheading will have):
* texinfo.tex (chapterzzz{#3}%):
* texinfo.tex (subsubsection = \numberedsubsubsec):
* texinfo.tex (subsubsection = \appendixsubsubsec):
* texinfo.tex (subsubsection = \unnumberedsubsubsec):
* texinfo.tex (sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%):
* texinfo.tex (sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%):
* texinfo.tex (sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%):
* texinfo.tex (sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%):
* texinfo.tex (sectionheading{#1}{subsec}{Yappendix}%):
* texinfo.tex (sectionheading{#1}{subsec}{Ynothing}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Ynumbered}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Yappendix}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Ynothing}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Yomitfromtoc}{}):
* texinfo.tex (sectionheading to do the printing.):
* texinfo.tex (sectionlevel}{#1}{#4}%):
* texinfo.tex (sectionheading, q.v.):
Sync with FSF 23.1.92.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Fri, 19 Feb 2010 22:39:19 -0600 |
parents | 422b4b4fb2a6 |
children | 308d34e9f07d |
rev | line source |
---|---|
853 | 1 /* DDE client for XEmacs. |
2 Copyright (C) 2002 Alastair J. Houghton | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
23 /* -- Includes -------------------------------------------------------------- */ | |
24 | |
25 #ifdef HAVE_CONFIG_H | |
26 # include <config.h> | |
27 #endif | |
2993 | 28 #include <windows.h> |
29 #include <ddeml.h> | |
853 | 30 #include <stdlib.h> |
31 #include <stdio.h> | |
32 #include <ctype.h> | |
33 #include <errno.h> | |
34 | |
5030 | 35 #ifdef __CYGWIN__ |
36 #include <stdlib.h> | |
37 #include <unistd.h> | |
38 #endif | |
39 | |
853 | 40 static void error (const char* s1, const char* s2); |
41 static void fatal (const char *s1, const char *s2); | |
42 static void * xmalloc (size_t size); | |
43 static char * getNextArg (const char **ptr, unsigned *len); | |
44 | |
45 /* -- Post-Include Defines -------------------------------------------------- */ | |
46 | |
47 /* Timeouts & delays */ | |
5030 | 48 #define CONNECT_RETRIES 20 |
853 | 49 #define CONNECT_DELAY 500 /* ms */ |
50 #define TRANSACTION_TIMEOUT 5000 /* ms */ | |
51 #define MAX_INPUT_IDLE_WAIT INFINITE /* ms */ | |
52 | |
53 /* DDE Strings */ | |
54 #define SERVICE_NAME "XEmacs" | |
55 #define TOPIC_NAME "System" | |
56 #define COMMAND_FORMAT "[open(\"%s%s\")]" | |
57 | |
58 /* XEmacs program name */ | |
5030 | 59 #define GENERIC_PROGRAM EMACS_PROGNAME ".exe" |
60 #define VERSIONED_PROGRAM EMACS_PROGNAME "-" EMACS_VERSION ".exe" | |
853 | 61 |
62 /* -- Constants ------------------------------------------------------------- */ | |
63 | |
64 /* -- Global Variables ------------------------------------------------------ */ | |
65 | |
66 HINSTANCE hInstance; | |
67 DWORD idInst = 0; | |
68 | |
69 /* -- Function Declarations ------------------------------------------------- */ | |
70 | |
71 HDDEDATA CALLBACK ddeCallback (UINT uType, UINT uFmt, HCONV hconv, | |
72 HSZ hsz1, HSZ hsz2, HDDEDATA hdata, | |
73 DWORD dwData1, DWORD dwData2); | |
74 | |
75 int WINAPI WinMain (HINSTANCE hInst, | |
76 HINSTANCE hPrev, | |
77 LPSTR lpCmdLine, | |
78 int nCmdShow); | |
79 | |
80 static HCONV openConversation (void); | |
81 static void closeConversation (HCONV hConv); | |
82 static int doFile (HCONV hConv, LPSTR lpszFileName1, LPSTR lpszFileName2); | |
83 static int parseCommandLine (HCONV hConv, LPSTR lpszCommandLine); | |
84 | |
85 /* -- Function Definitions -------------------------------------------------- */ | |
86 | |
87 /* | |
88 * Name : ddeCallback | |
89 * Function: Gets called by DDEML. | |
90 * | |
91 */ | |
92 | |
93 HDDEDATA CALLBACK | |
94 ddeCallback (UINT uType, UINT uFmt, HCONV hconv, | |
95 HSZ hsz1, HSZ hsz2, HDDEDATA hdata, | |
96 DWORD dwData1, DWORD dwData2) | |
97 { | |
98 return (HDDEDATA) NULL; | |
99 } | |
100 | |
101 /* | |
102 * Name : WinMain | |
103 * Function: The program's entry point function. | |
104 * | |
105 */ | |
106 | |
107 int WINAPI | |
108 WinMain (HINSTANCE hInst, | |
109 HINSTANCE hPrev, | |
110 LPSTR lpCmdLine, | |
111 int nCmdShow) | |
112 { | |
113 HCONV hConv; | |
114 int ret = 0; | |
115 UINT uiRet; | |
5030 | 116 |
853 | 117 /* Initialise the DDEML library */ |
118 uiRet = DdeInitialize (&idInst, | |
119 (PFNCALLBACK) ddeCallback, | |
120 APPCMD_CLIENTONLY | |
121 |CBF_FAIL_ALLSVRXACTIONS, | |
122 0); | |
123 | |
124 if (uiRet != DMLERR_NO_ERROR) | |
125 { | |
126 MessageBox (NULL, "Could not initialise DDE management library.", | |
127 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
128 | |
129 return 1; | |
130 } | |
131 | |
132 /* Open a conversation */ | |
133 hConv = openConversation (); | |
134 | |
135 if (hConv) | |
136 { | |
137 /* OK. Next, we need to parse the command line. */ | |
138 ret = parseCommandLine (hConv, lpCmdLine); | |
139 | |
140 /* Close the conversation */ | |
141 closeConversation (hConv); | |
142 } | |
5030 | 143 |
853 | 144 DdeUninitialize (idInst); |
145 | |
146 return ret; | |
147 } | |
148 | |
149 /* | |
150 * Name : openConversation | |
151 * Function: Start a conversation. | |
152 * | |
153 */ | |
154 | |
155 static HCONV | |
156 openConversation (void) | |
157 { | |
158 HSZ hszService = NULL, hszTopic = NULL; | |
159 HCONV hConv = NULL; | |
160 | |
161 /* Get the application (service) name */ | |
162 hszService = DdeCreateStringHandle (idInst, | |
163 SERVICE_NAME, | |
164 CP_WINANSI); | |
165 | |
166 if (!hszService) | |
167 { | |
168 MessageBox (NULL, "Could not create string handle for service.", | |
169 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
170 | |
171 goto error; | |
172 } | |
5030 | 173 |
853 | 174 /* Get the topic name */ |
175 hszTopic = DdeCreateStringHandle (idInst, | |
176 TOPIC_NAME, | |
177 CP_WINANSI); | |
178 | |
179 if (!hszTopic) | |
180 { | |
181 MessageBox (NULL, "Could not create string handle for topic.", | |
182 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
183 | |
184 goto error; | |
185 } | |
186 | |
187 /* Try to connect */ | |
188 hConv = DdeConnect (idInst, hszService, hszTopic, NULL); | |
189 | |
190 if (!hConv) | |
191 { | |
192 STARTUPINFO sti; | |
193 PROCESS_INFORMATION pi; | |
194 int n; | |
5030 | 195 |
853 | 196 /* Try to start the program */ |
197 ZeroMemory (&sti, sizeof (sti)); | |
198 sti.cb = sizeof (sti); | |
5030 | 199 if (!CreateProcess (NULL, GENERIC_PROGRAM, NULL, NULL, FALSE, 0, |
200 NULL, NULL, &sti, &pi) && | |
201 !CreateProcess (NULL, VERSIONED_PROGRAM, NULL, NULL, FALSE, 0, | |
853 | 202 NULL, NULL, &sti, &pi)) |
203 { | |
204 MessageBox (NULL, "Could not start process.", | |
205 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
206 | |
207 goto error; | |
208 } | |
209 | |
210 /* Wait for the process to enter an idle state */ | |
211 WaitForInputIdle (pi.hProcess, MAX_INPUT_IDLE_WAIT); | |
212 | |
213 /* Close the handles */ | |
214 CloseHandle (pi.hThread); | |
215 CloseHandle (pi.hProcess); | |
5030 | 216 |
853 | 217 /* Try to connect */ |
4464
61aff09a7589
Increase DDE connection retries because waiting for XEmacs to start
Vin Shelton <acs@xemacs.org>
parents:
2993
diff
changeset
|
218 for (n = 0; n < CONNECT_RETRIES; n++) |
853 | 219 { |
220 Sleep (CONNECT_DELAY); | |
5030 | 221 |
853 | 222 hConv = DdeConnect (idInst, hszService, hszTopic, NULL); |
223 | |
224 if (hConv) | |
225 break; | |
226 } | |
227 | |
228 if (!hConv) | |
229 { | |
230 /* Still couldn't connect. */ | |
231 MessageBox (NULL, "Could not connect to DDE server.", | |
232 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
233 | |
234 goto error; | |
235 } | |
236 } | |
237 | |
238 /* Release the string handles */ | |
239 DdeFreeStringHandle (idInst, hszService); | |
240 DdeFreeStringHandle (idInst, hszTopic); | |
241 | |
242 return hConv; | |
5030 | 243 |
853 | 244 error: |
245 if (hConv) | |
246 DdeDisconnect (hConv); | |
247 if (hszService) | |
248 DdeFreeStringHandle (idInst, hszService); | |
249 if (hszTopic) | |
250 DdeFreeStringHandle (idInst, hszTopic); | |
251 | |
252 return NULL; | |
253 } | |
254 | |
255 /* | |
256 * Name : closeConversation | |
257 * Function: Close a conversation. | |
258 * | |
259 */ | |
260 | |
261 static void | |
262 closeConversation (HCONV hConv) | |
263 { | |
264 /* Shut down */ | |
265 DdeDisconnect (hConv); | |
266 } | |
267 | |
268 /* | |
269 * Name : doFile | |
270 * Function: Process a file. | |
271 * | |
272 */ | |
273 | |
274 int | |
275 doFile (HCONV hConv, LPSTR lpszFileName1, LPSTR lpszFileName2) | |
276 { | |
277 char *buf = NULL; | |
278 unsigned len; | |
5030 | 279 |
853 | 280 /* Calculate the buffer length */ |
281 len = strlen (lpszFileName1) + strlen (lpszFileName2) | |
282 + strlen (COMMAND_FORMAT); | |
5030 | 283 |
853 | 284 /* Allocate a buffer */ |
285 buf = (char *) xmalloc (len); | |
286 | |
287 if (!buf) | |
288 { | |
289 MessageBox (NULL, "Not enough memory.", | |
290 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
291 | |
292 return 1; | |
293 } | |
294 | |
295 /* Build the command */ | |
296 len = wsprintf (buf, COMMAND_FORMAT, lpszFileName1, lpszFileName2); | |
5030 | 297 len++; |
853 | 298 |
299 /* OK. We're connected. Send the message. */ | |
300 DdeClientTransaction (buf, len, hConv, NULL, | |
301 0, XTYP_EXECUTE, TRANSACTION_TIMEOUT, NULL); | |
302 | |
303 free (buf); | |
5030 | 304 |
853 | 305 return 0; |
306 } | |
307 | |
308 /* | |
309 * Name : getNextArg | |
310 * Function: Retrieve the next command line argument. | |
311 * | |
312 */ | |
313 | |
314 static char * | |
315 getNextArg (const char **ptr, unsigned *len) | |
316 { | |
317 int in_quotes = 0, quit = 0, all_in_quotes = 0; | |
318 const char *p = *ptr, *start; | |
319 char *buf = NULL; | |
320 unsigned length = 0; | |
321 | |
322 /* Skip whitespace */ | |
323 while (*p && isspace (*p)) | |
324 p++; | |
325 | |
326 /* If this is the end, return NULL */ | |
327 if (!*p) | |
328 return NULL; | |
5030 | 329 |
853 | 330 /* Remember where we are */ |
331 start = p; | |
5030 | 332 |
853 | 333 /* Find the next whitespace character outside quotes */ |
334 if (*p == '"') | |
335 all_in_quotes = 1; | |
5030 | 336 |
853 | 337 while (*p && !quit) |
338 { | |
339 switch (*p) | |
340 { | |
341 case '"': | |
342 in_quotes = 1 - in_quotes; | |
343 p++; | |
344 break; | |
345 | |
346 case '\\': | |
347 if (!in_quotes) | |
348 all_in_quotes = 0; | |
5030 | 349 |
853 | 350 p++; |
351 | |
352 if (!*p) | |
353 break; | |
354 | |
355 p++; | |
356 break; | |
357 | |
358 default: | |
359 if (isspace (*p) && !in_quotes) | |
360 quit = 1; | |
361 else if (!in_quotes) | |
362 all_in_quotes = 0; | |
363 | |
364 if (!quit) | |
365 p++; | |
366 } | |
367 } | |
368 | |
369 /* Work out the length */ | |
370 length = p - start; | |
371 | |
372 /* Strip quotes if the argument is completely quoted */ | |
373 if (all_in_quotes) | |
374 { | |
375 start++; | |
376 length -= 2; | |
377 } | |
5030 | 378 |
853 | 379 /* Copy */ |
380 buf = (char *) xmalloc (length + 1); | |
381 | |
382 if (!buf) | |
383 return NULL; | |
5030 | 384 |
853 | 385 strncpy (buf, start, length); |
386 buf[length] = '\0'; | |
387 | |
388 /* Return the pointer and length */ | |
389 *ptr = p; | |
390 *len = length; | |
391 | |
392 return buf; | |
393 } | |
394 | |
395 /* | |
396 * Name : parseCommandLine | |
397 * Function: Process the command line. This program accepts a list of strings | |
398 * : (which may contain wildcards) representing filenames. | |
399 * | |
400 */ | |
401 | |
402 int | |
403 parseCommandLine (HCONV hConv, LPSTR lpszCommandLine) | |
404 { | |
405 char *fullpath, *filepart; | |
406 char *arg; | |
407 unsigned len, pathlen; | |
408 int ret = 0; | |
409 HANDLE hFindFile = NULL; | |
410 WIN32_FIND_DATA wfd; | |
411 | |
412 /* Retrieve arguments */ | |
413 while ((arg = getNextArg ((const char**)&lpszCommandLine, &len)) != NULL) | |
414 { | |
5030 | 415 fullpath = NULL; |
416 #ifdef __CYGWIN__ | |
417 /* If the filename is not an absolute path, | |
418 add the current directory to the pathname */ | |
419 if (*arg != '/') | |
420 { | |
421 len = pathconf(".", _PC_PATH_MAX); | |
422 fullpath = (char *) xmalloc (len+1); | |
423 if (!fullpath) | |
424 { | |
425 MessageBox (NULL, "Not enough memory.", "winclient", | |
426 MB_ICONEXCLAMATION | MB_OK); | |
427 ret = 1; | |
428 break; | |
429 } | |
430 if (!getcwd(fullpath, (size_t)len)) | |
431 { | |
432 MessageBox (NULL, "Could not retrieve current directory.", | |
433 "winclient", MB_ICONEXCLAMATION | MB_OK); | |
434 ret = 1; | |
435 break; | |
436 } | |
437 /* Append trailing slash */ | |
438 strcat(fullpath, "/"); | |
439 ret = doFile (hConv, fullpath, arg); | |
440 } | |
441 else | |
442 { | |
443 /* The arg has already been expanded, so pass it as it is */ | |
444 ret = doFile (hConv, "", arg); | |
445 } | |
446 #else | |
853 | 447 /* First find the canonical path name */ |
448 fullpath = filepart = NULL; | |
449 pathlen = GetFullPathName (arg, 0, fullpath, &filepart); | |
450 | |
451 fullpath = (char *) xmalloc (pathlen); | |
452 | |
453 if (!fullpath) | |
454 { | |
455 MessageBox (NULL, "Not enough memory.", "winclient", | |
456 MB_ICONEXCLAMATION | MB_OK); | |
457 ret = 1; | |
458 break; | |
459 } | |
460 | |
461 GetFullPathName (arg, pathlen, fullpath, &filepart); | |
462 | |
463 /* Find the first matching file */ | |
464 hFindFile = FindFirstFile (arg, &wfd); | |
465 | |
466 if (hFindFile == INVALID_HANDLE_VALUE) | |
467 ret = doFile (hConv, fullpath, ""); | |
468 else | |
469 { | |
470 /* Chop off the file part from the full path name */ | |
471 if (filepart) | |
472 *filepart = '\0'; | |
473 | |
474 /* For each matching file */ | |
475 do | |
476 { | |
477 /* Process it */ | |
478 ret = doFile (hConv, fullpath, wfd.cFileName); | |
479 | |
480 if (ret) | |
481 break; | |
482 } | |
483 while (FindNextFile (hFindFile, &wfd)); | |
484 | |
485 FindClose (hFindFile); | |
486 } | |
5030 | 487 #endif |
853 | 488 /* Release the path name buffers */ |
5030 | 489 if (fullpath) |
490 free (fullpath); | |
853 | 491 free (arg); |
492 | |
493 if (ret) | |
494 break; | |
495 } | |
496 | |
497 return ret; | |
498 } | |
499 | |
500 static void | |
501 fatal (const char *s1, const char *s2) | |
502 { | |
503 error (s1, s2); | |
504 exit (1); | |
505 } | |
506 | |
507 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
508 static void | |
509 error (const char* s1, const char* s2) | |
510 { | |
511 fprintf (stderr, "winclient: "); | |
512 fprintf (stderr, s1, s2); | |
513 fprintf (stderr, "\n"); | |
514 } | |
515 | |
516 /* Like malloc but get fatal error if memory is exhausted. */ | |
517 | |
518 static void * | |
519 xmalloc (size_t size) | |
520 { | |
521 void *result = malloc (size); | |
522 if (result == NULL) | |
523 fatal ("virtual memory exhausted", (char *) 0); | |
524 return result; | |
525 } |