/********************************************************************** * File: nwmain.h * Description: Tool to declare main, making windows invisible. * Author: Ray Smith * Created: Fri Sep 07 13:27:50 MDT 1995 * * (C) Copyright 1995, Hewlett-Packard Co. ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** http://www.apache.org/licenses/LICENSE-2.0 ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. * **********************************************************************/ #ifndef RUNMAIN_H #define RUNMAIN_H #include "host.h" #include "params.h" #define DECLARE_MAIN(ARGC,ARGV)\ STRING_VAR(init_config_file,"config","Config file to read on startup");\ REALLY_DECLARE_MAIN(ARGC,ARGV) #define DECLARE_MAIN_CONFIG(ARGC,ARGV,NAME)\ STRING_VAR(init_config_file,NAME,"Config file to read on startup");\ REALLY_DECLARE_MAIN(ARGC,ARGV) #ifndef __UNIX__ #define REALLY_DECLARE_MAIN(ARGC,ARGV)\ \ /**********************************************************************\ * parse_args\ *\ * Turn a list of args into a new list of args with each separate\ * whitespace spaced string being an arg.\ **********************************************************************/\ \ inT32 parse_args( /*refine arg list*/\ inT32 argc, /*no of input args*/\ char *argv[], /*input args*/\ char *arglist[] /*output args*/\ )\ {\ inT32 argcount; /*converted argc*/\ char *testchar; /*char in option string*/\ inT32 arg; /*current argument*/\ \ argcount=0; /*no of options*/\ for (arg=0;arg<argc;arg++)\ {\ testchar=argv[arg]; /*start of arg*/\ do\ {\ while (*testchar\ && (*testchar==' ' || *testchar=='"' || *testchar=='\n' || *testchar=='\t'))\ testchar++; /*skip white space*/\ if (*testchar)\ {\ arglist[argcount++]=testchar; /*new arg*/\ do\ {\ for (testchar++;*testchar\ && *testchar!=' ' && *testchar!='"' && *testchar!='\n' && *testchar!='\t';\ testchar++); /*skip to white space*/\ }\ while (*testchar=='"' && testchar[1]!=' ' && testchar[1]!='\0' && testchar[1]!='\n' && testchar[1]!='\t');\ if (*testchar)\ *testchar++='\0'; /*turn to separate args*/\ }\ }\ while (*testchar);\ }\ return argcount; /*new number of args*/\ }\ \ inT32 global_exit_code;\ inT32 real_main(inT32,const char**);\ \ inT32 run_main( /*the main thread*/\ CWinApp* theapp /*arguments*/\ )\ {\ char **argv;\ char *argsin[2];\ inT32 argc;\ inT32 exit_code;\ \ argsin[0]=strdup(theapp->m_pszExeName);\ argsin[1]=strdup(theapp->m_lpCmdLine);\ /*allocate memory for the args. There can never be more than half*/\ /*the total number of characters in the arguments.*/\ argv=(char**)malloc(((strlen(argsin[0])+strlen(argsin[1]))/2+1)*sizeof(char*));\ \ /*now construct argv as it should be for C.*/\ argc=parse_args(2,argsin,argv);\ \ /*call main(argc,argv) here*/\ exit_code=real_main(argc,(const char **)argv);\ \ \ /*now get rid of the main app window*/\ if (theapp!=NULL && theapp->m_pMainWnd!=NULL)\ PostMessage(theapp->m_pMainWnd->m_hWnd,WM_QUIT,0,0);\ free(argsin[0]);\ free(argsin[1]);\ free(argv);\ global_exit_code=exit_code;\ return exit_code;\ }\ \ inT32 real_main(inT32 ARGC,const char* ARGV[])\ #else #define REALLY_DECLARE_MAIN(ARGC,ARGV)\ \ /**********************************************************************\ * parse_args\ *\ * Turn a list of args into a new list of args with each separate\ * whitespace spaced string being an arg.\ **********************************************************************/\ \ inT32 parse_args( /*refine arg list*/\ inT32 argc, /*no of input args*/\ char *argv[], /*input args*/\ char *arglist[] /*output args*/\ )\ {\ inT32 argcount; /*converted argc*/\ char *testchar; /*char in option string*/\ inT32 arg; /*current argument*/\ \ argcount=0; /*no of options*/\ for (arg=0;arg<argc;arg++)\ {\ testchar=argv[arg]; /*start of arg*/\ do\ {\ while (*testchar\ && (*testchar==' ' || *testchar=='"' || *testchar=='\n' || *testchar=='\t'))\ testchar++; /*skip white space*/\ if (*testchar)\ {\ arglist[argcount++]=testchar; /*new arg*/\ do\ {\ for (testchar++;*testchar\ && *testchar!=' ' && *testchar!='"' && *testchar!='\n' && *testchar!='\t';\ testchar++); /*skip to white space*/\ }\ while (*testchar=='"' && testchar[1]!=' ' && testchar[1]!='\0' && testchar[1]!='\n' && testchar[1]!='\t');\ if (*testchar)\ *testchar++='\0'; /*turn to separate args*/\ }\ }\ while (*testchar);\ }\ return argcount; /*new number of args*/\ }\ \ inT32 main(inT32 ARGC,const char* ARGV[])\ #endif #else #error "NOT allowed to include nwmain.h or runmain.h twice!!" #endif