view winmain.c @ 2323:4b04943319c5

GTK4: Move a few more functions into thread safety. Add API to functions that were missing it. API is used for speficying calling convention, that isn't usually required on Unix, but should be there for future use. The thread safety macros will automatically add API, so just required to add it to ones not in the thread safety system.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 17 Feb 2021 06:21:27 +0000
parents 05dd5189099f
children
line wrap: on
line source

/* Dynamic Windows stub file to allow Win32 applications
 * to use the main() entry point instead of WinMain().
 *
 * (C) 2000-2012 Brian Smith <brian@dbsoft.org>
 */

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <process.h>

#ifndef NODW
void Win32_Set_Instance(HINSTANCE hInstance);
#endif

char **_convertargs(int *count, char *start, HINSTANCE DWInstance)
{
   char *tmp, *argstart, **argv;
   int loc = 0, inquotes = 0;

   (*count) = 1;

   tmp = start;

   /* Count the number of entries */
   if(*start)
   {
      (*count)++;

      while(*tmp)
      {
         if(*tmp == '"' && inquotes)
            inquotes = 0;
         else if(*tmp == '"' && !inquotes)
            inquotes = 1;
         else if(*tmp == ' ' && !inquotes)
         {
            /* Push past any white space */
            while(*(tmp+1) == ' ')
               tmp++;
            /* If we aren't at the end of the command
             * line increment the count.
             */
            if(*(tmp+1))
               (*count)++;
         }
         tmp++;
      }
   }

   argv = (char **)malloc(sizeof(char *) * ((*count)+1));
   argv[0] = malloc(260);
   GetModuleFileNameA(DWInstance, argv[0], 260);

   argstart = tmp = start;

   if(*start)
   {
      loc = 1;

      while(*tmp)
      {
         if(*tmp == '"' && inquotes)
         {
            *tmp = 0;
            inquotes = 0;
         }
         else if(*tmp == '"' && !inquotes)
         {
            argstart = tmp+1;
            inquotes = 1;
         }
         else if(*tmp == ' ' && !inquotes)
         {
            *tmp = 0;
            argv[loc] = _strdup(argstart);

            /* Push past any white space */
            while(*(tmp+1) == ' ')
               tmp++;

            /* Move the start pointer */
            argstart = tmp+1;

            /* If we aren't at the end of the command
             * line increment the count.
             */
            if(*(tmp+1))
               loc++;
         }
         tmp++;
      }
      if(*argstart)
         argv[loc] = _strdup(argstart);
   }
   argv[loc+1] = NULL;
   return argv;
}

/* Protoype for the application entrypoint */
int main(int argc, char **argv);

/* Ok this is a really big hack but what the hell ;) */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   char **argv;
   int argc;

#ifndef NODW
   Win32_Set_Instance(hInstance);
#endif

   argv = _convertargs(&argc, lpCmdLine, hInstance);

   return main(argc, argv);
}