找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 9978|回复: 2

CME脚本解释器初版

[复制链接]
发表于 2016-10-31 23:11:55 | 显示全部楼层 |阅读模式
本帖最后由 happy886rr 于 2016-10-31 23:21 编辑

CME is CMD and 易 for me.模仿cmd和易语言的脚本解释器,功能不是很多,只实现了基础的命令。支持中英文编程。
比如CME的注销用户脚本可以这样写

  1. 注销
  2. 暂停
复制代码
显示文本

  1. 显文 "要显示的.txt"
  2. 暂停
复制代码
易代表中文编程,如果不写易,则只识别类批处理风格英文关键词
  1. @echo off
  2. shutdown L
  3. pause
复制代码
  1. @echo off
  2. REM 移动窗口
  3. MW 100 300
  4. sleep 3000
  5. ps
  6. kl 1
  7. pause
复制代码
再如混合脚本
  1. @echo off
  2. color 1 2 0 8
  3. REM 查看当前进程
  4. PS
  5. SLEEP 1500
  6. color 4 2 0 8
  7. cls
  8. REM 查看磁盘信息
  9. DISK
  10. SLEEP 1500
  11. REM 切换编程语言

  12. 颜色 1 4 0 8
  13. 移窗 500 20
  14. 标题 CME脚本
  15. 显示 CME1.0脚本处理器
  16. 暂停
复制代码
因时间比较紧迫,1.0版的CME暂不开放set、if、for语句、goto语句还有点小问题还在测试。以后将提供兼容50%以上的标准cmd脚本,并提供一个cme编译器。目前支持的命令全部为集成命令。部分函数版权归原作者所有,如bmp、磁盘信息统计、一些windowsAPI函数版权归微软、还有一些参考的函数无法追忆版权归初始作者所有,除此之外剩余的70%的代码版权归本人所有。
部分功能请自行测试,主要支持双语编程,echo的速度比cmd的快一倍。
外链地址,图片存为a.zip解压即是。

源码

  1. /*
  2.         COPYRIGHT@2016~2018 BY HAPPY
  3.         CME Script
  4.         VERSION 1.0
  5. */
  6. #include   <stdio.h>
  7. #include  <stdlib.h>
  8. #include  <string.h>
  9. #include <windows.h>
  10. #include  <locale.h>
  11. #include <stdbool.h>
  12. #include   <conio.h>
  13. #include  <direct.h>
  14. #include   <tchar.h>
  15. #include    <time.h>
  16. #include<TlHelp32.h>

  17. #define BUFF_SIZE 4096
  18. #define CHECK_SIZE 16383
  19. #define FOLLOW_SIZE 1000
  20. #define FOLLOW_LINE 3
  21. #define FOLLOW_WAIT 20

  22. //全局变量
  23. int fsize=0, position=0, FLAG=255, ECHOFF=0, ERRORLEVEL=0, L_SN=0, E_LANGUAGE=0;
  24. int LAB[];
  25. char* RAMread;
  26. char ARG[16][255];

  27. //类型定义
  28. typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
  29. PROCGETCONSOLEWINDOW GetConsoleWindow;

  30. //GETOPT参数变量
  31. int OPTIND=1,OPTOPT;
  32. char *OPTARG;

  33. //添加关键词条目(请用小写定义),解释时不区分大小写。
  34. static const char* SENSITIVE_WORDS[]   ={"echo", "cls", "pause", "exit", "title", "mode con", "pos", "color", "if", "for", "set", "goto", "set/p", "set/a", "ls", "ps", "kl", "tl", "bmp", "mw", "rem", "@echo off", "mouse", "disk", "shutdown", "#$~*&NULL", "#$~*&NULL", "sleep", "易"};
  35. static const char* SENSITIVE_CN_WORDS[]={"显示", "清屏", "暂停", "退出", "标题", "窗体", "位置", "颜色", "如果", "循环", "设置", "跳转", "输入", "计算", "目录", "进程", "杀死", "显文", "位图", "移窗", "注释", "关闭回显", "鼠标", "磁盘", "关机", "注销", "重启", "睡眠"};
  36. //限制关键词数量                        
  37. #define SENSITIVE_NUM 29

  38. /***************解析函数群***************/
  39. //关键词解析函数
  40. inline int Identify_KeyWords()
  41. {
  42.         int i, SN;
  43.         if(E_LANGUAGE==1){
  44.                 for(SN=0; SN<SENSITIVE_NUM-1; SN++){
  45.                         for(i=0; SENSITIVE_CN_WORDS[SN][i]!='\0'; i++){
  46.                                 if(
  47.                                          RAMread[position+i]   !=SENSITIVE_CN_WORDS[SN][i] &&
  48.                                          RAMread[position+i]+32!=SENSITIVE_CN_WORDS[SN][i]
  49.                                 
  50.                                 ){
  51.                                         break;
  52.                                 }
  53.                         }
  54.                          if(
  55.                                  (SENSITIVE_CN_WORDS[SN][i]=='\0' && FLAG!=0) &&
  56.                                 (
  57.                                         (RAMread[position+i]== ' ') ||
  58.                                         (RAMread[position+i]== '.') ||
  59.                                         (RAMread[position+i]== ';') ||
  60.                                         (RAMread[position+i]=='\r') ||
  61.                                         (RAMread[position+i]=='\n') ||
  62.                                         (RAMread[position+i]=='\t') ||
  63.                                         (RAMread[position+i]== '&') ||
  64.                                         (position+i==fsize)
  65.                                 )
  66.                         ){
  67.                                 position+=i;
  68.                                 return SN;
  69.                         }
  70.                 }
  71.                 return 255;
  72.         }
  73.         for(SN=0; SN<SENSITIVE_NUM; SN++){
  74.                 for(i=0; SENSITIVE_WORDS[SN][i]!='\0'; i++){
  75.                         if(
  76.                                  RAMread[position+i]   !=SENSITIVE_WORDS[SN][i] &&
  77.                                  RAMread[position+i]+32!=SENSITIVE_WORDS[SN][i]
  78.                                 
  79.                         ){
  80.                                 break;
  81.                         }
  82.                 }
  83.                  if(
  84.                          (SENSITIVE_WORDS[SN][i]=='\0' && FLAG!=0) &&
  85.                         (
  86.                                 (RAMread[position+i]== ' ') ||
  87.                                 (RAMread[position+i]== '.') ||
  88.                                 (RAMread[position+i]== ';') ||
  89.                                 (RAMread[position+i]=='\r') ||
  90.                                 (RAMread[position+i]=='\n') ||
  91.                                 (RAMread[position+i]=='\t') ||
  92.                                 (RAMread[position+i]== '&') ||
  93.                                 (position+i==fsize)
  94.                         )
  95.                 ){
  96.                         position+=i;
  97.                         return SN;
  98.                 }
  99.         }                               
  100.         return 255;
  101. }
  102. //切分解析函数
  103. inline int Analytic_Spli()
  104. {
  105.         int i=0;
  106.         for(position++; position<fsize; position++){
  107.                 if(
  108.                         (RAMread[position]=='\r') ||
  109.                         (RAMread[position]=='\n') ||
  110.                         (RAMread[position]=='\0') ||
  111.                         (RAMread[position]== '&') ||
  112.                         (RAMread[position]== '|')
  113.                 ){
  114.                         break;
  115.                 }
  116.                 i++;
  117.         }
  118.         return i;
  119. }
  120. //命令行参数拆分
  121. int Split_Argv()
  122. {
  123.         int i, j=0, L=0, MARK1=0, MARK2=0, AC=0;
  124.         if((L=Analytic_Spli())<=1){return 0;}
  125.         i=position-L;
  126.         while(RAMread[i]==' '||RAMread[i]=='\t'){
  127.                 i++;
  128.         }
  129.         for(; i<position; i++){
  130.                 if(
  131.                         (RAMread[i]!= ' ') &&
  132.                         (RAMread[i]!='\t') &&
  133.                         (MARK1==0)
  134.                 ){       
  135.                         if(RAMread[i]=='"'){
  136.                                 i++, MARK2=1;
  137.                         }
  138.                         MARK1=1;
  139.                 }else if(
  140.                                 (RAMread[i]== ' ')||
  141.                                 (RAMread[i]=='\t')||
  142.                                 (RAMread[i]== '"')
  143.                 ){
  144.                         if(
  145.                                 (MARK1==1) &&
  146.                                 (MARK2==0) &&
  147.                                 (RAMread[i]!='"')
  148.                         ){
  149.                                 ARG[AC][j]='\0';
  150.                                 j=0, MARK1=0, AC++;
  151.                         }
  152.                         if(
  153.                                 (RAMread[i]=='"') &&
  154.                                 (MARK2==1)
  155.                         ){
  156.                                 MARK2=0;
  157.                         }       
  158.                 }       
  159.                 if(
  160.                         (MARK1==1) &&
  161.                         (RAMread[i]!='"')
  162.                 ){
  163.                         ARG[AC][j++]=RAMread[i];
  164.                 }
  165.         }
  166.         return AC+1;
  167. }

  168. /***************命令函数群***************/
  169. //打印函数
  170. inline int Shell_ECHO()
  171. {
  172.         int i=Analytic_Spli();
  173.         fwrite(RAMread+position-i, i, 1, stdout);
  174.         if(i){fputs("\r\n", stdout);}
  175.         return 0;
  176. }
  177. //REM函数
  178. inline int Shell_REM()
  179. {
  180.         if(ECHOFF==0){
  181.                 position--;
  182.                 fputs("REM", stdout);
  183.                 Shell_ECHO();
  184.                 return 1;
  185.         }
  186.         Analytic_Spli();
  187.         return 0;
  188. }
  189. //清屏函数
  190. int Shell_CLS()
  191. {
  192.         HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  193.         COORD coordScreen={0,0};
  194.         DWORD cCharsWritten;
  195.         CONSOLE_SCREEN_BUFFER_INFO csbi;
  196.         GetConsoleScreenBufferInfo(hConsole, &csbi);
  197.         FillConsoleOutputCharacter(hConsole,       (TCHAR)' ', csbi.dwSize.X*csbi.dwSize.Y, coordScreen, &cCharsWritten);
  198.         GetConsoleScreenBufferInfo(hConsole, &csbi);
  199.         FillConsoleOutputAttribute(hConsole, csbi.wAttributes, csbi.dwSize.X*csbi.dwSize.Y, coordScreen, &cCharsWritten);
  200.         SetConsoleCursorPosition(hConsole,coordScreen);
  201.         return 0;
  202. }
  203. //暂停函数
  204. int Shell_PAUSE()
  205. {
  206.         if(ECHOFF==0){
  207.                 if(E_LANGUAGE=0){
  208.                         fputs("\r\nPAUSE...", stdout);
  209.                 }else{
  210.                         fputs("\r\n请按任意键继续...", stdout);
  211.                 }
  212.         }
  213.         getch();
  214.         return 0;
  215. }
  216. //退出函数
  217. int Shell_EXIT(int Exit_Code)
  218. {
  219.         exit(Exit_Code);
  220. }
  221. //标题函数
  222. int Shell_TITLE(char* Str)
  223. {
  224.         SetConsoleTitle(Str);
  225.         return 0;
  226. }
  227. //跳转函数
  228. int Shell_GOTO(int len)
  229. {
  230.         int i, j;
  231.         for(j=0; j<L_SN; j++){
  232.                 for(i=0; i<len; i++){
  233.                         printf("%c#####%c\n",RAMread[position-len+i],  RAMread[LAB[j]+i]);
  234.                         RAMread[position-len+i]!=RAMread[LAB[j]+i];
  235.                         break;
  236.                 }
  237.                 if(i==len){
  238.                         position=RAMread[LAB[j]];
  239.                         return 0;
  240.                 }
  241.         }
  242.         fputs("Can not find label :" ,stdout);
  243.         fwrite(RAMread+position-len, len, 1, stdout);
  244.         return 1;
  245. }
  246. //光标函数
  247. int Shell_POS(int x,int y)
  248. {
  249.         COORD pos;
  250.         HANDLE hOutput;
  251.         pos.X=x;
  252.         pos.Y=y;
  253.         hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  254.         SetConsoleCursorPosition(hOutput,pos);
  255.         return 0;
  256. }
  257. //睡眠函数
  258. int Shell_SLEEP(int t)
  259. {
  260.         Sleep(t);
  261.         return 0;
  262. }
  263. //按键函数
  264. int Shell_KEY(clock_t delay)
  265. {
  266.         int i,KEY_V,start=clock();
  267.         do{
  268.                 if(kbhit()){
  269.                          KEY_V=(int)(getch());
  270.                         if(KEY_V<97){KEY_V+=32;}
  271.                         return KEY_V;
  272.                 }
  273.                 for(i=0;i<=50;i++);
  274.         }while((clock()-start)<delay);
  275.         return -1;
  276. }
  277. //鼠标点击函数:KEY_V取值1、2对应鼠标左右键点击;当取值为0时则隐藏光标;
  278. int Shell_MOUSE(int KEY_V)
  279. {
  280.         if(KEY_V==0){
  281.                 CONSOLE_CURSOR_INFO cursor_info={1,0};
  282.                 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
  283.                 return 0;
  284.         }
  285.         HANDLE StdIn=GetStdHandle(STD_INPUT_HANDLE);
  286.         DWORD  OrgMode, Res;
  287.         INPUT_RECORD InR;
  288.         GetConsoleMode(StdIn, &OrgMode);
  289.         SetConsoleMode(StdIn, OrgMode | ENABLE_WINDOW_INPUT |  ENABLE_MOUSE_INPUT);
  290.         for(;;){
  291.                 ReadConsoleInput(StdIn, &InR, 1, &Res);
  292.                 if(
  293.                         InR.Event.MouseEvent.dwEventFlags ==0  &&
  294.                         InR.Event.MouseEvent.dwButtonState==KEY_V
  295.                 ){
  296.                         SetConsoleMode(StdIn, OrgMode);
  297.                         return (InR.Event.MouseEvent.dwMousePosition.Y)*1000+(InR.Event.MouseEvent.dwMousePosition.X);
  298.                 }
  299.         }
  300. }
  301. //窗口大小
  302. int Shell_MODE_CON(int x, int y)
  303. {

  304.         HANDLE StdOut=GetStdHandle(STD_OUTPUT_HANDLE);
  305.         CONSOLE_SCREEN_BUFFER_INFO scbi;
  306.         COORD size={x, 300};
  307.         GetConsoleScreenBufferInfo(StdOut, &scbi);
  308.         SetConsoleScreenBufferSize(StdOut, size);
  309.         SMALL_RECT rc={0, 0, x-1, y-1};
  310.         SetConsoleWindowInfo(StdOut, 1, &rc);
  311.         CloseHandle(StdOut);
  312.         return 0;
  313. }
  314. //列举文件
  315. int Shell_LS(char* path)
  316. {
  317.         CHAR szFilePath[MAX_PATH];
  318.         HANDLE hListFile;
  319.         WIN32_FIND_DATA fileData;
  320.         lstrcpy(szFilePath, path);
  321.         lstrcat(szFilePath, "\\*");
  322.         hListFile = FindFirstFile(szFilePath,&fileData);
  323.         if(hListFile == INVALID_HANDLE_VALUE){return 1;}
  324.         printf("FILE LIST:\r\n");
  325.         do{
  326.                 printf("\t%s\r\n", fileData.cFileName );
  327.         }while(FindNextFile(hListFile, &fileData));
  328.         return 0;
  329. }
  330. //列举进程
  331. int Shell_PS()
  332. {
  333.         HANDLE hSnapshot;
  334.         HANDLE hProcess;
  335.         PROCESSENTRY32 pe32;
  336.         hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  337.         if( hSnapshot == INVALID_HANDLE_VALUE )
  338.         {
  339.                 printf( "CreateToolhelp32Snapshot (of processes) failed\n" );
  340.                 return 1;
  341.         }
  342.         pe32.dwSize = sizeof( PROCESSENTRY32 );
  343.         if( !Process32First( hSnapshot, &pe32 ) )
  344.         {
  345.                 printf( "Process32First() failed\n" );
  346.                 CloseHandle( hSnapshot );
  347.                 return 1;
  348.         }
  349.         printf("                [PROCESS]   [PID]  [PPID]  [THRE]   [PRI]\r\n---------------------------------------------------------------\r");
  350.         do{
  351.                 printf( "\n%25s", pe32.szExeFile );
  352.                 printf( "%8u", pe32.th32ProcessID );
  353.                 printf( "%8u", pe32.th32ParentProcessID );
  354.                 printf( "%8d", pe32.cntThreads );
  355.                 printf( "%8d", pe32.pcPriClassBase );
  356.         }while( Process32Next( hSnapshot, &pe32 ) );
  357.         CloseHandle( hSnapshot );
  358.         fputc('\n',stdout);
  359.         return 0;
  360. }
  361. //结束进程
  362. int Shell_KL(int ProcessID)
  363. {
  364.         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)ProcessID);
  365.         TerminateProcess(hProcess, 0);
  366.         return 0;
  367. }
  368. //字体颜色: 1,2,4,8前景;16,32,64,128后景;
  369. int Shell_COLOR(unsigned short A,unsigned short B,unsigned short C,unsigned short D)
  370. {
  371.         HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
  372.         CONSOLE_SCREEN_BUFFER_INFO csbi;
  373.         GetConsoleScreenBufferInfo(handle_out, &csbi);
  374.         SetConsoleTextAttribute(handle_out, A | B | C | D);
  375.         return 0;
  376. }
  377. //位图显示
  378. int Shell_BMP(

  379.                 char* file ,         //位图文件;
  380.                 int x,int y,         //相对窗口起始坐标x,y;
  381.                 int W,int H,         //要粘贴的宽度高度W,H;
  382.                 int X,int Y          //相对缓存DC的坐标X,Y;
  383.                 )
  384. {
  385.         HMODULE hKernel32=GetModuleHandle("kernel32");
  386.         GetConsoleWindow=(PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
  387.         HWND cmd=GetConsoleWindow();
  388.         HDC dc=GetDC(cmd);
  389.         HBITMAP hBitmap;
  390.         hBitmap=(HBITMAP)LoadImage(NULL, file, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  391.         HDC cmdmem=CreateCompatibleDC(dc);
  392.         SelectObject(cmdmem, hBitmap);
  393.         BitBlt(dc, x, y, W, H, cmdmem, X, Y, SRCCOPY);
  394.         return 0;
  395. }
  396. //移动窗口
  397. int Shell_MW(int x, int y)
  398. {
  399.         HMODULE hKernel32 = GetModuleHandle("kernel32");
  400.         GetConsoleWindow= (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
  401.         HWND cmd=GetConsoleWindow();
  402.         SetWindowPos(cmd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE);       
  403.         return 0;
  404. }
  405. //关机函数S取值r、l、p、空;对应重启、注销、关电源、关机;
  406. int Shell_SHUTDOWN(char S)
  407. {
  408.         HANDLE hToken;
  409.         TOKEN_PRIVILEGES tkp;
  410.         if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){
  411.                 return 1;
  412.         }
  413.         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
  414.         tkp.PrivilegeCount=1;         
  415.         tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  416.         AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  417.         if(GetLastError() !=ERROR_SUCCESS){
  418.                 return 1;
  419.         }
  420.         if      (S=='r'||S=='R'){
  421.                 ExitWindowsEx(EWX_REBOOT   | EWX_FORCE, 0);       
  422.         }else if(S=='l'||S=='L'){
  423.                 ExitWindowsEx(EWX_LOGOFF   | EWX_FORCE, 0);       
  424.         }else if(S=='p'||S=='P'){
  425.                 ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);       
  426.         }else{
  427.                 ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
  428.         }
  429.         return 0;
  430. }
  431. //磁盘信息
  432. void utoiRightJustified(TCHAR* szLeft, TCHAR* szRight, unsigned uVal)
  433. {
  434.         TCHAR* szCur = szRight;
  435.         int nComma = 0;
  436.         if (uVal) {
  437.                 while (uVal && (szCur >= szLeft)) {
  438.                         if (nComma == 3) {
  439.                                 *szCur = ',';
  440.                                 nComma = 0;
  441.                         }else {
  442.                                 *szCur = (uVal % 10) | 0x30;
  443.                                 uVal /= 10;
  444.                                 ++nComma;
  445.                         }
  446.                         --szCur;
  447.                 }
  448.         } else {
  449.                 *szCur = '0';
  450.                 --szCur;
  451.         }

  452.         if (uVal) {
  453.                 szCur = szLeft;
  454.                 while (szCur <= szRight) {
  455.                         *szCur = '*';
  456.                         ++szCur;
  457.                 }
  458.         }
  459. }
  460. int Shell_DISK(){
  461.         DWORD dwDrive;
  462.         INT nDrive;
  463.         char dName[4] ;
  464.         char* Driver;
  465.         long GB = 1024*1024*1024;
  466.         ULARGE_INTEGER Free ;
  467.         ULARGE_INTEGER Total ;
  468.         ULARGE_INTEGER TotalFree ;
  469.         dwDrive = GetLogicalDrives();
  470.         printf(
  471.                 "  ------------------------------------\n"
  472.                 "│DRIVE│FREE CAPACITY│TOTAL CAPACITY│                              DISK\n"
  473.                 "  ------------------------------------\n"
  474.                 "  ------------------------------------\n"       
  475.         );
  476.         for ( nDrive = 0 ; nDrive < 26 ; nDrive++ ){
  477.                 if ( dwDrive & (1 << nDrive) ){
  478.                         sprintf(dName,"%c:",(nDrive + 'A'));
  479.                         Driver =(char*)dName;
  480.                         if(GetDiskFreeSpaceEx(Driver, &Free, &Total, &TotalFree)){
  481.                                 printf("│ %s  │    %3I64u GB   │     %3I64u GB   │\n",Driver,Free.QuadPart/GB,Total.QuadPart/GB);
  482.                         }
  483.                 }
  484.         }
  485.         printf("  ------------------------------------\n");
  486.         TCHAR   g_szBorder[] = _T("  ------------------------------------------------------------------------\n");
  487.         TCHAR   g_szTitle1[] = _T("│DRIVE│TOTAL CLUSTERS│AVAIL CLUSTERS│SECTORS / CLUSTER│BYTES / SECTOR│\n");
  488.         TCHAR   g_szTitle2[] = _T("  ------------------------------------------------------------------------\n  ------------------------------------------------------------------------\n");
  489.         TCHAR   g_szLine[]   = _T("│  :  │              │              │                 │              │\n");
  490.         TCHAR szMsg[4200];
  491.         struct _diskfree_t df = {0};
  492.         ULONG uDriveMask = _getdrives();
  493.         unsigned uErr, uLen, uDrive;
  494.         printf(g_szBorder);
  495.         printf(g_szTitle1);
  496.         printf(g_szTitle2);
  497.         for (uDrive=1; uDrive<=26; ++uDrive) {
  498.                 if (uDriveMask & 1) {
  499.                         uErr = _getdiskfree(uDrive, &df);
  500.                         memcpy(szMsg, g_szLine, sizeof(g_szLine));
  501.                         szMsg[3] = uDrive + 'A' - 1;
  502.                         char lp[5] = "C://";
  503.                         lp [0] = uDrive + 'A' - 1;
  504.                         if (uErr == 0) {
  505.                                     utoiRightJustified(szMsg+8,  szMsg+19, df.total_clusters);
  506.                                     utoiRightJustified(szMsg+23, szMsg+34, df.avail_clusters);
  507.                                     utoiRightJustified(szMsg+38, szMsg+52, df.sectors_per_cluster);
  508.                                     utoiRightJustified(szMsg+56, szMsg+67, df.bytes_per_sector);
  509.                         } else {
  510.                                 uLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, uErr, 0, szMsg+8, 4100, NULL);
  511.                                 szMsg[uLen+6] = ' ';
  512.                                 szMsg[uLen+7] = ' ';
  513.                                 szMsg[uLen+8] = ' ';
  514.                         }
  515.                         printf(szMsg);
  516.                 }
  517.                 uDriveMask >>= 1;
  518.                 if (!uDriveMask)
  519.                 break;
  520.         }
  521.         printf(g_szBorder);
  522.         return 0;
  523. }

  524. /***************业务函数群***************/
  525. //参数解析函数
  526. int GETOPT(int nargc, char *nargv[], char *ostr)
  527. {
  528.         static char* place="";
  529.         static char* lastostr=(char *) 0;
  530.         register char* oli;
  531.         char* index();
  532.         if(ostr!=lastostr){
  533.                 lastostr=ostr;
  534.                 place="";
  535.         }
  536.         if(!*place){
  537.                 if(
  538.                         (OPTIND>=nargc)              ||
  539.                         (*(place=nargv[OPTIND])!='/')||
  540.                         (! *++place)
  541.                 ){
  542.                         place="";
  543.                         return(EOF);
  544.                 }
  545.                 if (*place == '/' && place[1] == 0){
  546.                         ++OPTIND;
  547.                         return(EOF);
  548.                 }
  549.         }
  550.         if ((OPTOPT=(int)*place++)==(int)':' || !(oli=strchr(ostr, OPTOPT))){
  551.                 if(!*place){++OPTIND;}
  552.         }
  553.         if (*++oli!=':'){
  554.                 OPTARG=NULL;
  555.                 if(!*place){++OPTIND;}
  556.         }
  557.         else{
  558.                 if(*place){
  559.                         OPTARG=place;
  560.                 }else if(nargc<=++OPTIND){
  561.                         place="";
  562.                 }else{
  563.                         OPTARG=nargv[OPTIND];
  564.                 }
  565.                 place="";
  566.                 ++OPTIND;
  567.         }
  568.         return(OPTOPT);
  569. }
  570. char* UnicodeToANSI(const wchar_t* Str)
  571. {
  572.         int L=WideCharToMultiByte(CP_ACP, 0, Str, -1, NULL, 0, NULL, NULL);
  573.         char* Out=(char *)calloc(L+1, sizeof(char));
  574.         WideCharToMultiByte(CP_ACP, 0, Str, -1, Out, L, NULL, NULL);
  575.         return Out;
  576. }
  577. wchar_t* UTF8ToUnicode(const char* Str)
  578. {
  579.         int L=MultiByteToWideChar(CP_UTF8, 0, Str,-1, NULL, 0);
  580.         wchar_t* Out=(wchar_t *)calloc(L+1, sizeof(wchar_t));
  581.         MultiByteToWideChar(CP_UTF8, 0, Str, -1, (LPWSTR)Out, L);
  582.         return Out;
  583. }
  584. wchar_t* BIG5ToUnicode(const char* Str)
  585. {
  586.         int L=MultiByteToWideChar(950, 0, Str,-1, NULL, 0);
  587.         wchar_t* Out=(wchar_t *)calloc(L+1, sizeof(wchar_t));
  588.         MultiByteToWideChar(950, 0, Str, -1, (LPWSTR)Out, L);
  589.         return Out;
  590. }
  591. bool isUTF8(const char* Str)
  592. {
  593.         if(!Str){
  594.                 return false;
  595.         }
  596.         const unsigned char* bytes=(const unsigned char *)Str;
  597.         while(*bytes){
  598.                 if(
  599.                         (
  600.                                  bytes[0]<=0x7F ||
  601.                                 bytes[0]==0x09 ||
  602.                                 bytes[0]==0x0A ||
  603.                                 bytes[0]==0x0D ||
  604.                                 (0x20<=bytes[0] && bytes[0]<=0x7E)
  605.                         )
  606.                 ){
  607.                         bytes+=1;
  608.                         continue;
  609.                 }
  610.                 if(
  611.                          (
  612.                                 (0xC2<=bytes[0] && bytes[0]<=0xDF) &&
  613.                                 (0x80<=bytes[1] && bytes[1]<=0xBF)
  614.                         )
  615.                 ){
  616.                         bytes+=2;
  617.                         continue;
  618.                 }
  619.                 if(
  620.                         (
  621.                                                   (bytes[0]==0xE0) &&
  622.                                 (0xA0<=bytes[1] && bytes[1]<=0xBF) &&
  623.                                 (0x80<=bytes[2] && bytes[2]<=0xBF)
  624.                         ) ||
  625.                         (
  626.                                 (
  627.                                         (0xE1<=bytes[0] && bytes[0]<=0xEC)||
  628.                                                            bytes[0]==0xEE ||
  629.                                                            bytes[0]==0xEF
  630.                                                                  ) &&
  631.                                 (0x80<=bytes[1] && bytes[1]<=0xBF) &&
  632.                                 (0x80<=bytes[2] && bytes[2]<=0xBF)
  633.                         ) ||
  634.                         (
  635.                                                   (bytes[0]==0xED) &&
  636.                                 (0x80<=bytes[1] && bytes[1]<=0x9F) &&
  637.                                 (0x80<=bytes[2] && bytes[2]<=0xBF)
  638.                         )
  639.                 ){
  640.                         bytes+=3;
  641.                         continue;
  642.                 }
  643.                 if(
  644.                         (
  645.                                                   (bytes[0]==0xF0) &&
  646.                                 (0x90<=bytes[1] && bytes[1]<=0xBF) &&
  647.                                 (0x80<=bytes[2] && bytes[2]<=0xBF) &&
  648.                                 (0x80<=bytes[3] && bytes[3]<=0xBF)
  649.                         ) ||
  650.                         (
  651.                                 (0xF1<=bytes[0] && bytes[0]<=0xF3) &&
  652.                                 (0x80<=bytes[1] && bytes[1]<=0xBF) &&
  653.                                 (0x80<=bytes[2] && bytes[2]<=0xBF) &&
  654.                                 (0x80<=bytes[3] && bytes[3]<=0xBF)
  655.                         ) ||
  656.                         (
  657.                                                   (bytes[0]==0xF4) &&
  658.                                 (0x80<=bytes[1] && bytes[1]<=0x8F) &&
  659.                                 (0x80<=bytes[2] && bytes[2]<=0xBF) &&
  660.                                 (0x80<=bytes[3] && bytes[3]<=0xBF)
  661.                         )
  662.                 ){
  663.                         bytes+=4;
  664.                         continue;
  665.                 }
  666.                 return false;
  667.         }
  668.         return true;
  669. }
  670. bool isGB2312(const char* Str)
  671. {
  672.         if(!Str){
  673.                 return false;
  674.         }
  675.         const unsigned char* bytes=(const unsigned char *)Str;
  676.         while(*bytes){
  677.                 if(
  678.                         (
  679.                                  bytes[0]<=0x7F ||
  680.                                 bytes[0]==0x09 ||
  681.                                 bytes[0]==0x0A ||
  682.                                 bytes[0]==0x0D ||
  683.                                 (0x20<=bytes[0] && bytes[0]<=0x7E)
  684.                         )
  685.                 ){
  686.                         bytes+=1;
  687.                         continue;
  688.                 }
  689.                 if(
  690.                         (0xA1<=bytes[0] && bytes[0]<=0xF7) &&
  691.                         (0xA1<=bytes[1] && bytes[1]<=0xFE)
  692.                 ){
  693.                         bytes+=2;
  694.                         continue;
  695.                 }
  696.                 return false;       
  697.         }
  698.         return true;
  699. }
  700. bool isBIG5(const char* Str)
  701. {
  702.         if(!Str){
  703.                 return false;
  704.         }
  705.         const unsigned char* bytes=(const unsigned char *)Str;
  706.         while(*bytes){
  707.                 if(
  708.                         (
  709.                                  bytes[0]<=0x7F ||
  710.                                 bytes[0]==0x09 ||
  711.                                 bytes[0]==0x0A ||
  712.                                 bytes[0]==0x0D ||
  713.                                 (0x20<=bytes[0] && bytes[0]<=0x7E)
  714.                         )
  715.                 ){
  716.                         bytes+=1;
  717.                         continue;
  718.                 }
  719.                 if(
  720.                         (0xA1<=bytes[0] && bytes[0]<=0xF9) &&
  721.                         (
  722.                                 (0x40<=bytes[1] && bytes[1]<=0x7E) ||
  723.                                 (0xA1<=bytes[1] && bytes[1]<=0xFE)
  724.                         )
  725.                 ){
  726.                         bytes+=2;
  727.                         continue;
  728.                 }
  729.                 return false;       
  730.         }
  731.         return true;
  732. }
  733. int CheckBom(FILE* fp)
  734. {
  735.         unsigned char* buf=(unsigned char*)calloc(3,sizeof(unsigned char));
  736.         unsigned char* buf2;
  737.         fseeko64(fp, (__int64)0, SEEK_SET);
  738.         fread(buf, sizeof(unsigned char), 3, fp);
  739.              if(buf[0]==0xEF && buf[1]==0xBB && buf[2]==0xBF){return 3;}
  740.         else if(buf[0]==0xFF && buf[1]==0xFE){return 5;}
  741.         else if(buf[0]==0xFE && buf[1]==0xFF){return 6;}
  742.         else{
  743.                 fseeko64(fp, (__int64)0, SEEK_SET);
  744.                 buf2=(unsigned char*)calloc(CHECK_SIZE,sizeof(unsigned char));
  745.                 fread(buf2, sizeof(unsigned char), CHECK_SIZE, fp);
  746.                 if(isUTF8(buf2)){
  747.                         return 2;
  748.                 }else if(isGB2312(buf2)){
  749.                         return 1;
  750.                 }else if(isBIG5(buf2)){
  751.                         return 4;
  752.                 }
  753.         }
  754.         return 1;
  755. }
  756. void Help_Information_Tl(FILE* stream, int a)
  757. {
  758.         fprintf(stream,
  759.                 ">>>------------------------------------------------------------\n"
  760.                 "DISPLAYS THE CONTENTS OF A TEXT FILE\n"
  761.                 "VERSION 2.0\n"
  762.                 "tl  [file] [-n&num1,num2]|[-p&per1,per2]|[-i]|[-d&num]\n"
  763.                 "---------------------------------------------------------------\n\n"
  764.                 "    -h  Show help information\n"
  765.                 "    -n  Read lines from num1 to num2\n"
  766.                 "    -p  Read lines from percent1 to percent2\n"
  767.                 "    -i  Show file's information\n"
  768.                 "    -d  Detection latest num lines \n"       
  769.                 "---------------------------------------------------------------\n"
  770.         );
  771.         return;
  772. }
  773. int Getkey(int N,int T)
  774. {
  775.         int i,KEY_V,start=clock();
  776.         do{
  777.                 if(kbhit()){
  778.                          KEY_V=(int)(getch());
  779.                         if(KEY_V<97){KEY_V+=32;}
  780.                         return KEY_V;
  781.                 }
  782.                 for(i=0;i<=N;i++);
  783.         }while((clock()-start)<T);
  784.         return -1;
  785. }
  786. int CountLines(FILE* fp)
  787. {
  788.         int i=0;
  789.         char* line=(char *)malloc(BUFF_SIZE*sizeof(char));       
  790.         while(!feof(fp)){
  791.                 fgets(line, BUFF_SIZE, fp);
  792.                 i++;
  793.         }
  794.         return i;
  795. }
  796. void File_Information(FILE* fp, char* fname)
  797. {
  798.         fseeko64(fp, (__int64)0, SEEK_END);
  799.         __int64 fsize=ftello64(fp);
  800.         fseeko64(fp, (__int64)0, SEEK_SET);
  801.         int linenum=CountLines(fp);
  802.         fprintf(stdout,
  803.                 "FILE NAME : %s\n"
  804.                 "FILE SIZE : %I64d\n"
  805.                 "FILE LINES: %d\n"
  806.                 ,fname, fsize, linenum
  807.         );
  808. }
  809. int DisplayLine(FILE* fp, int flag, int N1, int N2, __int64 F1, __int64 F2)
  810. {
  811.         int i=0, n=0, BOM=0, EN=0;
  812.         BOM=CheckBom(fp);
  813.         if(BOM==1 || BOM==2 || BOM==4){
  814.                 EN=0;
  815.         }else if(BOM==5 || BOM==6){
  816.                 EN=2;
  817.         }else if(BOM==3){
  818.                 EN=3;
  819.         }
  820.         if      (flag==0){
  821.                         fseeko64(fp, (__int64)EN, SEEK_SET);
  822.         }else if(flag==1||flag==3){
  823.                         __int64 FD=(N1*BUFF_SIZE>F2)?F2:N1*BUFF_SIZE;
  824.                         fseeko64(fp, -FD, SEEK_END);
  825.                         N1=CountLines(fp)-N1+1;
  826.                         fseeko64(fp, -FD, SEEK_END);
  827.         }else if(flag==2){
  828.                         fseeko64(fp,  F1, SEEK_SET);
  829.         }
  830.         if(BOM<5){
  831.                 char* Line=(char *)malloc(BUFF_SIZE*sizeof(char));
  832.                 while(!feof(fp)||flag==3){
  833.                         memset(Line, 0, BUFF_SIZE*sizeof(char));
  834.                         if(!fgets(Line, BUFF_SIZE, fp)){Sleep(1);}
  835.                         i++;
  836.                         if( ((N1<=i) && (i<=N2) && (F1<=ftello64(fp)) && (ftello64(fp)<=F2))||(flag==3) ){
  837.                                 switch(BOM){
  838.                                         case 1: //Ansi行显
  839.                                                 fputs(Line, stdout);
  840.                                                 break;
  841.                                         case 2: //Utf8无BOM行显
  842.                                         case 3: //Utf8行显
  843.                                                 fputs(UnicodeToANSI(UTF8ToUnicode(Line)), stdout);
  844.                                                 break;
  845.                                         case 4: //Big5行显
  846.                                                 fputs(UnicodeToANSI(BIG5ToUnicode(Line)), stdout);
  847.                                                 break;
  848.                                 }
  849.                         }else if((i>N2) && (ftello64(fp)>=F2)){
  850.                                 break;
  851.                         }
  852.                 }
  853.         }else if(BOM==5){                       //Unicode行显
  854.                 wchar_t* LineW=(wchar_t *)calloc(BUFF_SIZE, sizeof(wchar_t));
  855.                 while(!feof(fp)||(flag==3)){
  856.                         memset(LineW, 0, BUFF_SIZE*sizeof(wchar_t));
  857.                         if(!fgetws(LineW, BUFF_SIZE, fp)){Sleep(1);}
  858.                         i++;
  859.                         if( ((N1<=i) && (i<=N2) && (F1<=ftello64(fp)) && (ftello64(fp)<=F2))||(flag==3) ){
  860.                                 fputs(UnicodeToANSI(LineW), stdout);
  861.                         }else if((i>N2) && (ftello64(fp)>=F2)){
  862.                                 break;
  863.                         }
  864.                 }
  865.         }else if(BOM==6){                       //Unicode big endian行显
  866.                 wchar_t* LineW=(wchar_t *)calloc(BUFF_SIZE, sizeof(wchar_t));
  867.                 while(!feof(fp)||(flag==3)){
  868.                         memset(LineW, 0, BUFF_SIZE*sizeof(wchar_t));
  869.                         if(!fgets(LineW, BUFF_SIZE, fp)){Sleep(1);}
  870.                         i++;
  871.                         if( ((N1<=i) && (i<=N2) && (F1<=ftello64(fp)) && (ftello64(fp)<=F2))||(flag==3) ){
  872.                                 for(n=0;LineW[n]!=0x0000;n++){
  873.                                         LineW[n]=(LineW[n]&0x00FF)<<8|(LineW[n]&0xFF00)>>8;
  874.                                 }
  875.                                 fputs(UnicodeToANSI(LineW), stdout);
  876.                         }else if((i>N2) && (ftello64(fp)>=F2)){
  877.                                 break;
  878.                         }
  879.                 }
  880.         }
  881.         fflush(stdout);
  882.         return 0;
  883. }
  884. //TL函数入口
  885. int Shell_TL(int argc)
  886. {
  887.         int N1=1, N2=2147483631, FLAG=0, i;
  888.         __int64 fsize=0;
  889.         float P1=0.0, P2=1.0;
  890.         FILE* fp;
  891.         char* delims;
  892.         if((argc==2) && (ARG[1][0]=='-')){
  893.                 switch(ARG[1][1]){
  894.                         case 'H':
  895.                         case 'h':
  896.                                 Help_Information_Tl(stdout, 0);
  897.                                 return 1;
  898.                         case 'N':
  899.                         case 'n':
  900.                                 delims=(ARG[1]+2);
  901.                                 N1=atoi(strtok(delims, ","));
  902.                                 N2=atoi(strtok(NULL, ","));
  903.                                 if(N2==0){N2=2147483631;}
  904.                                 if((N1>N2) || (N1<0) || (N2<0)){Help_Information_Tl(stderr, 1);return 1;}
  905.                                 break;
  906.                         case 'P':
  907.                         case 'p':
  908.                                 delims=(ARG[1]+2);
  909.                                 P1=atof(strtok(delims, ","));
  910.                                 P2=atof(strtok(NULL, ","));
  911.                                 if((P1>=P2) || (P1>1.0) || (P2>1.0) || (P1<0.0) || (P2<0.0) ){Help_Information_Tl(stderr, 1);return 1;}
  912.                                 FLAG=2;
  913.                                 break;
  914.                         case 'I':
  915.                         case 'i':
  916.                                 if( (fp=fopen64(ARG[0], "rb"))==NULL ){fputs("Read failed.", stdout);return 3;}
  917.                                 File_Information(fp, ARG[0]);
  918.                                 fclose(fp);
  919.                                 return 0;
  920.                         case 'D':
  921.                         case 'd':
  922.                                 delims=(ARG[1]+2);
  923.                                 N1=abs(atoi(delims)), N1=(N1>FOLLOW_SIZE)?1000:N1, FLAG=1;
  924.                                 if(ARG[1][2]=='\0'){N1=FOLLOW_LINE,FLAG=3;}
  925.                                 break;
  926.                         default:
  927.                                 Help_Information_Tl(stderr, 2);return 1;
  928.                 }
  929.         }else if(argc!=1){
  930.                 Help_Information_Tl(stderr, 3);return 1;
  931.         }
  932.         if( (fp=fopen64(ARG[0], "rb"))==NULL ){
  933.                 fputs("Read failed.", stdout);
  934.                 return 3;
  935.         }
  936.         if(FLAG==1){

  937.                 do{
  938.                         fseeko64(fp, (__int64)0, SEEK_END);
  939.                         if( fsize!=ftello64(fp)){
  940.                                 fsize =ftello64(fp);
  941.                                 system("cls");
  942.                                 DisplayLine(fp, 1, N1, 2147483631, 0, fsize);
  943.                         }
  944.                 }while(Getkey(64,FOLLOW_WAIT)!=113);
  945.                 fputs("\n", stdout);
  946.                 fclose(fp);
  947.                 return 0;
  948.         }
  949.         fseeko64(fp, (__int64)0, SEEK_END);
  950.         fsize=ftello64(fp);
  951.         DisplayLine(fp, FLAG, N1, N2, fsize*P1, fsize*P2);
  952.         fclose(fp);
  953.         return 0;
  954. }
  955. //帮助信息
  956. void Help_Information(FILE* stream, int Exit_Code)
  957. {
  958.         fprintf(stream,
  959.                 "==================================================\n"
  960.                 "CME [VERSION 1.0]\n"
  961.                 "==================================================\n"
  962.                 "    [ECHO]      Display string\n"
  963.                 "    [CLS]       Clear screen\n"
  964.                 "    [PAUSE]     Time out\n"
  965.                 "    [EXIT ]     Drop out\n"
  966.                 "    [TITLE]     Set the title\n"
  967.                 "    [MODE CON]  Window settings\n"
  968.                 "    [POS]       Set the Cursor position\n"
  969.                 "    [COLOR]     Font color\n"
  970.                 "    [GOTO]      Tag jumps\n"
  971.                 "    [LS]        List the specified directory files\n"
  972.                 "    [PS]        List the processes\n"
  973.                 "    [KL]        End a process\n"
  974.                 "    [CAT]       View a txt file\n"
  975.                 "    [BMP]       Displays a bitmap\n\n"
  976.                 "==================================================\n"
  977.                 "                                        1029TE0\n"
  978.         );
  979.         exit(Exit_Code);
  980. }
  981. //脚本解释函数
  982. int CME()
  983. {        int i=0;
  984.         while(i++<fsize){
  985.                 if(
  986.                         (RAMread[i]== ' ') ||
  987.                         (RAMread[i]=='\r') ||
  988.                         (RAMread[i]=='\n') ||
  989.                         (RAMread[i]=='\t') ||
  990.                         (RAMread[i]== '&') ||
  991.                         (RAMread[i]== '|') ||
  992.                         (RAMread[i]=='\0')
  993.                 ){
  994.                         continue;
  995.                 }
  996.                 if(RAMread[i]==':'){
  997.                                 i+=Analytic_Spli();
  998.                                 LAB[L_SN++]=i;
  999.                 }
  1000.         }
  1001.         position=0;
  1002.         while(position<fsize){
  1003.                 if(
  1004.                         (RAMread[position]== ' ') ||
  1005.                         (RAMread[position]=='\r') ||
  1006.                         (RAMread[position]=='\n') ||
  1007.                         (RAMread[position]=='\t') ||
  1008.                         (RAMread[position]== '&') ||
  1009.                         (RAMread[position]== '|') ||
  1010.                         (RAMread[position]=='\0')
  1011.                 ){
  1012.                         position++;FLAG=255;
  1013.                         if(RAMread[position]==':'){
  1014.                                 Analytic_Spli();
  1015.                                 LAB[L_SN++]=position;
  1016.                         }
  1017.                         continue;
  1018.                 }
  1019.                 FLAG=Identify_KeyWords(position);
  1020.                 switch(FLAG){
  1021.                         case 255:
  1022.                                 printf("ERROR [At this time should not have "");
  1023.                                 fwrite(RAMread+position, 12, 1, stdout);
  1024.                                 fputs(" "]\n", stdout);
  1025.                                 Shell_PAUSE();
  1026.                                 return 1;
  1027.                         case 0:
  1028.                                 Shell_ECHO();
  1029.                                 break;
  1030.                         case 1:
  1031.                                 Shell_CLS();
  1032.                                 break;
  1033.                         case 2:
  1034.                                 Shell_PAUSE();
  1035.                                 break;
  1036.                         case 3:
  1037.                                 Shell_EXIT(0);
  1038.                                 break;
  1039.                         case 4:
  1040.                                 if(Split_Argv()==1){
  1041.                                         Shell_TITLE(ARG[0]);
  1042.                                 }
  1043.                                 break;
  1044.                         case 5:
  1045.                                 if(Split_Argv()==2){
  1046.                                         Shell_MODE_CON(atoi(ARG[0]), atoi(ARG[1]));
  1047.                                 }
  1048.                                 break;
  1049.                         case 6:
  1050.                                 if(Split_Argv()==2){
  1051.                                         Shell_POS(atoi(ARG[0]), atoi(ARG[1]));
  1052.                                 }
  1053.                                 break;
  1054.                         case 7:
  1055.                                 if(Split_Argv()==4){
  1056.                                         Shell_COLOR(atoi(ARG[0]), atoi(ARG[1]), atoi(ARG[2]), atoi(ARG[3]));
  1057.                                 }else{
  1058.                                         Shell_COLOR(1,2,4,8);
  1059.                                 }
  1060.                                 break;
  1061.                         case 8:
  1062.                                 //Shell_IF();
  1063.                                 break;
  1064.                         case 9:
  1065.                                 //Shell_FOR();
  1066.                                 break;
  1067.                         case 10:
  1068.                                 //Shell_SET();
  1069.                                 break;
  1070.                         case 11:
  1071.                                 //Shell_GOTO(Analytic_Spli());
  1072.                                 break;
  1073.                         case 12:
  1074.                                 //Shell_SET/P();
  1075.                                 break;
  1076.                         case 13:
  1077.                                 //Shell_SET/A();
  1078.                                 break;
  1079.                         case 14:
  1080.                                 if(Split_Argv()==1){
  1081.                                         Shell_LS(ARG[0]);
  1082.                                 }else{
  1083.                                         Shell_LS(".");
  1084.                                 }
  1085.                                 break;
  1086.                         case 15:
  1087.                                 Shell_PS();
  1088.                                 break;
  1089.                         case 16:
  1090.                                 if(Split_Argv()==1){
  1091.                                         Shell_KL(atoi(ARG[0]));
  1092.                                 }
  1093.                                 break;
  1094.                         case 17:
  1095.                                 Shell_TL(Split_Argv());
  1096.                                 break;
  1097.                         case 18:
  1098.                                 if(Split_Argv()==7){
  1099.                                         Shell_BMP(ARG[0], atoi(ARG[1]), atoi(ARG[2]), atoi(ARG[3]), atoi(ARG[4]), atoi(ARG[5]), atoi(ARG[6]));
  1100.                                 }else{
  1101.                                         Shell_BMP(ARG[0], 100, 100, 300, 300, 0, 0);
  1102.                                 }
  1103.                                 break;
  1104.                         case 19:
  1105.                                 if(Split_Argv()==2){
  1106.                                         Shell_MW(atoi(ARG[0]), atoi(ARG[1]));
  1107.                                 }
  1108.                                 break;
  1109.                         case 20:
  1110.                                 Shell_REM();
  1111.                                 break;
  1112.                         case 21:
  1113.                                 ECHOFF=1;
  1114.                                 break;
  1115.                         case 22:
  1116.                                 if(Split_Argv()==1){
  1117.                                         Shell_MOUSE(atoi(ARG[0]));
  1118.                                 }
  1119.                                 break;
  1120.                         case 23:
  1121.                                 Shell_DISK();
  1122.                                 break;
  1123.                         case 24:
  1124.                                 if(Split_Argv()==0){
  1125.                                         Shell_SHUTDOWN('\0');
  1126.                                 }else{
  1127.                                         Shell_SHUTDOWN(ARG[0][0]);
  1128.                                 }
  1129.                                 break;
  1130.                         case 25:
  1131.                                 if(Split_Argv()==0){
  1132.                                         Shell_SHUTDOWN('L');
  1133.                                 }
  1134.                                 break;
  1135.                         case 26:
  1136.                                 if(Split_Argv()==0){
  1137.                                         Shell_SHUTDOWN('R');
  1138.                                 }
  1139.                                 break;
  1140.                         case 27:
  1141.                                 if(Split_Argv()==1){
  1142.                                         Shell_SLEEP(atoi(ARG[0]));
  1143.                                 }
  1144.                                 break;
  1145.                         case 28:
  1146.                                 E_LANGUAGE=1;
  1147.                                 break;
  1148.                 }
  1149.         }
  1150.         return 0;
  1151. }

  1152. /*************MAIN主函数入口*************/
  1153. int main(int argc, char** argv)
  1154. {
  1155.         if(argc!=2){Help_Information(stderr, 2);}
  1156.         Shell_TITLE("CME Script");
  1157.         FILE* fp;
  1158.         if( (fp=fopen(argv[1], "rb"))==NULL ){
  1159.                 fputs("Read Error.\n", stdout);
  1160.         }
  1161.         //测量尺寸
  1162.         fseek(fp, 0, SEEK_END);
  1163.         if( (fsize=ftell(fp))>2*1024*1024 ){
  1164.                 fputs("The file is too large, out of memory.\n", stdout);
  1165.                 return 1;
  1166.         }
  1167.         fseek(fp, 0, SEEK_SET);
  1168.         //压入内存
  1169.         RAMread=(char*)calloc(fsize, sizeof(char));
  1170.         fread(RAMread, fsize, 1, fp);
  1171.         fclose(fp);
  1172.         //解析脚本
  1173.         CME();
  1174.         free(RAMread);
  1175.         return 0;
  1176. }
复制代码
发表于 2016-11-1 09:03:19 | 显示全部楼层
为楼主喝彩!
发表于 2016-11-1 15:49:46 | 显示全部楼层

这么NB是要上天啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:25 , Processed in 0.023168 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表