📄 cmdline.c
字号:
/*
Copyright 2001-2003 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
You may contact the author at:
mailto::camille@bluegrass.net
or by snail mail at:
David Lindauer
850 Washburn Ave Apt 99
Louisville, KY 40222
*/
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <dir.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
#define MAXFILES 10000
extern char *_oscmd;
extern HINSTANCE *hInstance;
int _argc;
char **_argv;
char *_passed_name;
static char oldcwd[256];
static int oldDrive = 0;
static struct ffblk fileBlock;
static char **filelist = 0;
static int filenum = 0, filecount = 0;
#ifndef _A_NORMAL
#define _A_NORMAL 0
#endif
static char *FirstFile(char *spec)
{
if (findfirst(spec, &fileBlock, _A_NORMAL))
return (0);
return (fileBlock.ff_name);
} static char *NextFile(void)
{
if (findnext(&fileBlock))
return (0);
return (fileBlock.ff_name);
}
//-------------------------------------------------------------------------
static int rfsort(const void *elem1, const void *elem2)
{
return (strcmp(*(char **)elem1, *(char **)elem2));
}
//-------------------------------------------------------------------------
static char *litlate(char *dir, char *t)
{
char *q, buf[256];
if (!t)
return 0;
if (dir)
{
strcpy(buf, dir);
q = strrchr(buf, '\\');
if (q)
strcpy(q + 1, t);
else
strcpy(buf, t);
}
else
strcpy(buf, t);
q = malloc(strlen(buf) + 1);
if (!q)
{
fprintf(stdout, "out of memory");
exit(1);
}
strcpy(q, buf);
return q;
}
//-------------------------------------------------------------------------
static void ClearFiles(void)
{
free(filelist);
filelist = 0;
filecount = 0;
}
//-------------------------------------------------------------------------
static char *ReadFiles(char *spec)
{
char buf[256];
int fullpath = FALSE;
if (spec[0] == '.' && spec[1] == '.')
{
char *p;
getcwd(buf, 256);
p = strlen(buf) + buf;
while (spec[0] == '.' && spec[1] == '.')
{
spec += 2;
while (*(p - 1) != '\\' && *(p - 1) != ':')
p--;
if (*(p - 1) == '\\')
p--;
if (spec[0] != '\\')
break;
spec++;
}
*p++ = '\\';
strcpy(p, spec);
}
else
strcpy(buf, spec);
if (strchr(buf, '\\'))
fullpath = TRUE;
if (!filelist)
{
filelist = malloc(sizeof(char*) * MAXFILES);
if (!filelist)
{
fprintf(stderr, "out of memory");
exit(1);
}
}
if ((filelist[0] = litlate(fullpath ? buf : 0, FirstFile(buf))) == 0)
{
return 0;
}
while ((filelist[++filecount] = litlate(fullpath ? buf : 0, NextFile())) !=
0)
if (filecount >= MAXFILES - 1)
{
fprintf(stderr,
"Too many files... qualify file names to limit to %d at a time",
MAXFILES);
break;
}
return (char*)1;
}
//-------------------------------------------------------------------------
static int qualify(char *name)
{
int i;
for (i = 0; i < strlen(name); i++)
if (!isalnum(*name) && *name != '\\' && *name != ':' && *name != '*'
&& *name != '?' && *name != '.')
return FALSE;
return TRUE;
}
//-------------------------------------------------------------------------
char **CmdLineToC(int *_argc, char *cmd)
{
char buf[200];
char *bufp[100], *ocl;
char *_cmdline = cmd;
char **_argv = 0;
int inquote = 0;
char *dir;
char *file;
char *fileName;
int drive;
filenum = 0;
filecount = 0;
*_argc = 1;
while (*_cmdline)
{
while (isspace(*_cmdline))
_cmdline++;
if (*_cmdline)
{
int wasquote = FALSE;
int i = 0;
while ((inquote || !isspace(*_cmdline)) && *_cmdline)
{
if (*_cmdline == '"')
{
wasquote = TRUE;
inquote = !inquote;
_cmdline++;
continue;
}
buf[i++] = *_cmdline++;
}
buf[i++] = 0;
if (!wasquote && qualify(buf))
{
if ((fileName = ReadFiles(buf)) == 0)
{
goto join;
}
if (filecount)
{
_argv = realloc(_argv, (*_argc + filecount) *sizeof(char*));
memcpy(_argv + *_argc, filelist, filecount *sizeof(char*));
*_argc += filecount;
ClearFiles();
}
else
goto join;
}
else
{
join: _argv = realloc(_argv, (*_argc + 1) *sizeof(char*));
_argv[(*_argc)++] = strdup(buf);
}
}
}
_argv = realloc(_argv, (*_argc + 1) *sizeof(char*));
_argv[ *_argc] = 0;
_passed_name = _argv[0];
GetModuleFileName(hInstance, buf, 200);
_argv[0] = strdup(buf);
return _argv;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -