erl.c

来自「OTP是开放电信平台的简称」· C语言 代码 · 共 143 行

C
143
字号
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include "init_file.h"typedef int ErlexecFunction(int, char **, HANDLE, int); #define INI_FILENAME "erl.ini"#define INI_SECTION "erlang"#define ERLEXEC_BASENAME "erlexec.dll"static void get_parameters(void);static void error(char* format, ...);static char *erlexec_name;static char *erlexec_dir;#ifdef WIN32_WERL#define WERL 1int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,		    PSTR szCmdLine, int iCmdShow){    int argc = __argc;    char **argv = __argv;#else#define WERL 0int main(int argc, char **argv){#endif  HANDLE erlexec_handle; /* Instance */  ErlexecFunction *win_erlexec;  char *path = malloc(100);  char *npath;  int pathlen;  get_parameters();  if ((pathlen = GetEnvironmentVariable("PATH",path,100)) == 0) {    error("No PATH variable (!)");  } else if (pathlen > 100) {    path = realloc(path,pathlen);    GetEnvironmentVariable("PATH",path,pathlen);  }  npath = malloc(strlen(path) + strlen(erlexec_dir) + 2);  sprintf(npath,"%s;%s",erlexec_dir,path);  SetEnvironmentVariable("PATH",npath);  if ((erlexec_handle = LoadLibrary(erlexec_name)) == NULL) {    error("Could not load module %s.",erlexec_name);  }  if ((win_erlexec = (ErlexecFunction *)        GetProcAddress(erlexec_handle,"win_erlexec")) == NULL) {    error("Could not find entry point \"win_erlexec\" in %s.", erlexec_name);  }  return (*win_erlexec)(argc,argv,erlexec_handle,WERL);  } static char *replace_filename(char *path, char *new_base) {    int plen = strlen(path);    char *res = malloc((plen+strlen(new_base)+1)*sizeof(char));    char *p;    strcpy(res,path);    for (p = res+plen-1 ;p >= res && *p != '\\'; --p)        ;    *(p+1) ='\0';    strcat(res,new_base);    return res;}static char *do_lookup_in_section(InitSection *inis, char *name, 				  char *section, char *filename){    char *p = lookup_init_entry(inis, name);    if (p == NULL) {	error("Could not find key %s in section %s of file %s",	      name,section,filename);    }    return _strdup(p);}static void get_parameters(void){    char buffer[MAX_PATH];    char *ini_filename;    HANDLE module = GetModuleHandle(NULL);    InitFile *inif;    InitSection *inis;    char *bindir;    if (module = NULL) {        error("Cannot GetModuleHandle()");    }    if (GetModuleFileName(module,buffer,MAX_PATH) == 0) {        error("Could not GetModuleFileName");    }    ini_filename = replace_filename(buffer,INI_FILENAME);    if ((inif = load_init_file(ini_filename)) == NULL) {	error("Could not load init file %s",ini_filename);    }    if ((inis = lookup_init_section(inif,INI_SECTION)) == NULL) {	error("Could not find section %s in init file %s",	      INI_SECTION, ini_filename);    }    erlexec_dir = do_lookup_in_section(inis, "Bindir", INI_SECTION, ini_filename);    erlexec_name = malloc(strlen(erlexec_dir) + strlen(ERLEXEC_BASENAME) + 2);    strcpy(erlexec_name,erlexec_dir);    strcat(erlexec_name, "\\" ERLEXEC_BASENAME);        free_init_file(inif);    free(ini_filename);}static void error(char* format, ...){    char sbuf[2048];    va_list ap;    va_start(ap, format);    vsprintf(sbuf, format, ap);    va_end(ap);#ifndef WIN32_WERL 	fprintf(stderr, "%s\n", sbuf);#else	MessageBox(NULL, sbuf, "Werl", MB_OK|MB_ICONERROR);#endif    exit(1);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?