• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**********************************************************************
2  * File:        nwmain.h
3  * Description: Tool to declare main, making windows invisible.
4  * Author:					Ray Smith
5  * Created:					Fri Sep 07 13:27:50 MDT 1995
6  *
7  * (C) Copyright 1995, Hewlett-Packard Co.
8  ** Licensed under the Apache License, Version 2.0 (the "License");
9  ** you may not use this file except in compliance with the License.
10  ** You may obtain a copy of the License at
11  ** http://www.apache.org/licenses/LICENSE-2.0
12  ** Unless required by applicable law or agreed to in writing, software
13  ** distributed under the License is distributed on an "AS IS" BASIS,
14  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  ** See the License for the specific language governing permissions and
16  ** limitations under the License.
17  *
18  **********************************************************************/
19 
20 #ifndef RUNMAIN_H
21 #define RUNMAIN_H
22 
23 #include          "host.h"
24 #include          "varable.h"
25 #include          "notdll.h"     //must be last include
26 
27 #define DECLARE_MAIN(ARGC,ARGV)\
28 STRING_VAR(init_config_file,"config","Config file to read on startup");\
29 REALLY_DECLARE_MAIN(ARGC,ARGV)
30 
31 #define DECLARE_MAIN_CONFIG(ARGC,ARGV,NAME)\
32 STRING_VAR(init_config_file,NAME,"Config file to read on startup");\
33 REALLY_DECLARE_MAIN(ARGC,ARGV)
34 
35 #ifndef __UNIX__
36 
37 #define REALLY_DECLARE_MAIN(ARGC,ARGV)\
38 \
39 /**********************************************************************\
40 * parse_args\
41 *\
42 * Turn a list of args into a new list of args with each separate\
43 * whitespace spaced string being an arg.\
44 **********************************************************************/\
45 \
46 inT32						parse_args(					/*refine arg list*/\
47 inT32						argc,						/*no of input args*/\
48 char						*argv[],					/*input args*/\
49 char						*arglist[]					/*output args*/\
50 )\
51 {\
52 	inT32					argcount;					/*converted argc*/\
53 	char					*testchar;					/*char in option string*/\
54 	inT32					arg;						/*current argument*/\
55 \
56 	argcount=0;											/*no of options*/\
57 	for (arg=0;arg<argc;arg++)\
58 	{\
59 		testchar=argv[arg];								/*start of arg*/\
60 		do\
61 		{\
62 			while (*testchar\
63 			&& (*testchar==' ' || *testchar=='"' || *testchar=='\n' || *testchar=='\t'))\
64 				testchar++;								/*skip white space*/\
65 			if (*testchar)\
66 			{\
67 				arglist[argcount++]=testchar;			/*new arg*/\
68 				do\
69 				{\
70 					for (testchar++;*testchar\
71 					&& *testchar!=' ' && *testchar!='"' && *testchar!='\n' && *testchar!='\t';\
72 					testchar++);							/*skip to white space*/\
73 				}\
74 				while (*testchar=='"' && testchar[1]!=' ' && testchar[1]!='\0' && testchar[1]!='\n' && testchar[1]!='\t');\
75 				if (*testchar)\
76 					*testchar++='\0';					/*turn to separate args*/\
77 			}\
78 		}\
79 		while (*testchar);\
80 	}\
81 	return argcount;									/*new number of args*/\
82 }\
83 \
84 inT32						global_exit_code;\
85 inT32						real_main(inT32,const char**);\
86 \
87 inT32						run_main(					/*the main thread*/\
88 CWinApp*					theapp						/*arguments*/\
89 )\
90 {\
91 	char					**argv;\
92 	char					*argsin[2];\
93 	inT32					argc;\
94 	inT32					exit_code;\
95 	\
96 	argsin[0]=strdup(theapp->m_pszExeName);\
97 	argsin[1]=strdup(theapp->m_lpCmdLine);\
98 /*allocate memory for the args. There can never be more than half*/\
99 /*the total number of characters in the arguments.*/\
100 	argv=(char**)malloc(((strlen(argsin[0])+strlen(argsin[1]))/2+1)*sizeof(char*));\
101 \
102 /*now construct argv as it should be for C.*/\
103 	argc=parse_args(2,argsin,argv);\
104 \
105 /*call main(argc,argv) here*/\
106 	exit_code=real_main(argc,(const char **)argv);\
107 \
108 \
109 /*now get rid of the main app window*/\
110 	if (theapp!=NULL && theapp->m_pMainWnd!=NULL)\
111 		PostMessage(theapp->m_pMainWnd->m_hWnd,WM_QUIT,0,0);\
112 	free(argsin[0]);\
113 	free(argsin[1]);\
114 	free(argv);\
115 	global_exit_code=exit_code;\
116 	return exit_code;\
117 }\
118 \
119 inT32						real_main(inT32 ARGC,const char* ARGV[])\
120 
121 #else
122 
123 #define REALLY_DECLARE_MAIN(ARGC,ARGV)\
124 \
125 /**********************************************************************\
126 * parse_args\
127 *\
128 * Turn a list of args into a new list of args with each separate\
129 * whitespace spaced string being an arg.\
130 **********************************************************************/\
131 \
132 inT32						parse_args(					/*refine arg list*/\
133 inT32						argc,						/*no of input args*/\
134 char						*argv[],					/*input args*/\
135 char						*arglist[]					/*output args*/\
136 )\
137 {\
138 	inT32					argcount;					/*converted argc*/\
139 	char					*testchar;					/*char in option string*/\
140 	inT32					arg;						/*current argument*/\
141 \
142 	argcount=0;											/*no of options*/\
143 	for (arg=0;arg<argc;arg++)\
144 	{\
145 		testchar=argv[arg];								/*start of arg*/\
146 		do\
147 		{\
148 			while (*testchar\
149 			&& (*testchar==' ' || *testchar=='"' || *testchar=='\n' || *testchar=='\t'))\
150 				testchar++;								/*skip white space*/\
151 			if (*testchar)\
152 			{\
153 				arglist[argcount++]=testchar;			/*new arg*/\
154 				do\
155 				{\
156 					for (testchar++;*testchar\
157 					&& *testchar!=' ' && *testchar!='"' && *testchar!='\n' && *testchar!='\t';\
158 					testchar++);							/*skip to white space*/\
159 				}\
160 				while (*testchar=='"' && testchar[1]!=' ' && testchar[1]!='\0' && testchar[1]!='\n' && testchar[1]!='\t');\
161 				if (*testchar)\
162 					*testchar++='\0';					/*turn to separate args*/\
163 			}\
164 		}\
165 		while (*testchar);\
166 	}\
167 	return argcount;									/*new number of args*/\
168 }\
169 \
170 inT32						main(inT32 ARGC,const char* ARGV[])\
171 
172 #endif
173 
174 #else
175 #error "NOT allowed to include nwmain.h or runmain.h twice!!"
176 #endif
177