dosinst.c
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:7k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved by Bram Moolenaar
  4.  *
  5.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  6.  * Do ":help credits" in Vim to see a list of people who contributed.
  7.  */
  8. /*
  9.  * install.c: Minimalistic install program for Vim on DOS/MS-Windows
  10.  *
  11.  * Compile with Makefile.bcc or Makefile.djg.
  12.  */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16. #include <string.h>
  17. #include <sys/stat.h>
  18. #ifdef WIN32
  19. # include <direct.h>
  20. #else
  21. # include <dir.h>
  22. #endif
  23. /*
  24.  * Obtain a choice from a table.
  25.  * First entry is a question, others are choices.
  26.  */
  27.     int
  28. get_choice(char **table, int entries)
  29. {
  30.     int answer;
  31.     int idx;
  32.     char dummy[100];
  33.     do
  34.     {
  35. for (idx = 0; idx < entries; ++idx)
  36. {
  37.     if (idx)
  38. printf("[%d] ", idx);
  39.     printf(table[idx]);
  40.     printf("n");
  41. }
  42. printf("Choice: ");
  43. if (scanf("%d", &answer) != 1)
  44. {
  45.     scanf("%99s", dummy);
  46.     answer = 0;
  47. }
  48.     }
  49.     while (answer < 1 || answer >= entries);
  50.     return answer;
  51. }
  52. /*
  53.  * Append a line to the autoexec.bat file.
  54.  */
  55.     void
  56. append_autoexec(char *s, char *v)
  57. {
  58.     FILE    *fd;
  59.     fd = fopen("c:\autoexec.bat", "a");
  60.     if (fd == NULL)
  61.     {
  62. printf("ERROR: Cannot open c:\autoexec.bat for appendingn");
  63. exit(1);
  64.     }
  65.     fprintf(fd, s, v);
  66.     fclose(fd);
  67.     printf("This line has been appended to c:\autoexec.bat:n");
  68.     printf(s, v);
  69. }
  70. /*
  71.  * Move a file to another directory.
  72.  */
  73.     void
  74. move_file(char *fname, char *dir)
  75. {
  76.     struct stat st;
  77.     char cmd[1000];
  78.     /* if the file doesn't exist, silently skip it */
  79.     if (stat(fname, &st) < 0)
  80. return;
  81.     sprintf(cmd, "move %s %s", fname, dir);
  82.     system(cmd);
  83.     if (stat(fname, &st) >= 0)
  84. printf("ERROR: Moving "%s" to "%s" failedn", fname, dir);
  85. }
  86. /*
  87.  * Ask for directory from $PATH to move the .exe files to.
  88.  */
  89.     void
  90. move_to_path(void)
  91. {
  92.     char *path;
  93.     char **names = NULL;
  94.     char *p, *s;
  95.     int count;
  96.     int idx;
  97.     char answer[10];
  98.     path = getenv("PATH");
  99.     if (path == NULL)
  100.     {
  101. printf("ERROR: The variable $PATH is not setn");
  102. return;
  103.     }
  104.     /*
  105.      * first round: count number of names in path;
  106.      * second round: save names to path[].
  107.      */
  108.     for (;;)
  109.     {
  110. count = 1;
  111. for (p = path; *p; )
  112. {
  113.     s = strchr(p, ';');
  114.     if (s == NULL)
  115. s = p + strlen(p);
  116.     if (names != NULL)
  117.     {
  118. names[count] = malloc(s - p + 1);
  119. if (names[count] == NULL)
  120. {
  121.     printf("ERROR: out of memoryn");
  122.     exit(1);
  123. }
  124. strncpy(names[count], p, s - p);
  125. names[count][s - p] = 0;
  126.     }
  127.     ++count;
  128.     p = s;
  129.     if (*p)
  130. ++p;
  131. }
  132. if (names != NULL)
  133.     break;
  134. names = malloc(count * sizeof(char *));
  135. if (names == NULL)
  136. {
  137.     printf("ERROR: out of memoryn");
  138.     exit(1);
  139. }
  140.     }
  141.     names[0] = "Select directory to move Vim executables to";
  142.     idx = get_choice(names, count);
  143.     printf("nYou have selected the directory:n");
  144.     printf(names[idx]);
  145.     printf("nDo you want to move the Vim executables there? (Y/N) ");
  146.     if (scanf(" %c", answer) < 1 || toupper(answer[0]) != 'Y')
  147. printf("Skipping moving Vim executablesn");
  148.     else
  149.     {
  150. move_file("vim.exe", names[idx]);
  151. move_file("gvim.exe", names[idx]);
  152. move_file("xxd.exe", names[idx]);
  153. move_file("ctags.exe", names[idx]);
  154. move_file("vimrun.exe", names[idx]);
  155.     }
  156. }
  157. #define TABLE_SIZE(s) sizeof(s) / sizeof(char *)
  158.     int
  159. main(int argc, char **argv)
  160. {
  161.     char answer[10];
  162.     char *(def_choices[]) =
  163.     {
  164. "nChoose the default way to run Vim:",
  165. "normal Vim setup",
  166. "with syntax highlighting and other features",
  167. "Vi compatible",
  168.     };
  169.     char *(select_choices[]) =
  170.     {
  171. "nChoose the way how text is selected:",
  172. "with Visual mode (the Unix way)",
  173. "with Select mode (the Windows way)",
  174. "mouse with Select mode, keys with Visual mode",
  175.     };
  176.     char *(exe_choices[]) =
  177.     {
  178. "nChoose the way to run Vim:",
  179. "set $PATH in c:\autoexec.bat",
  180. "move executables to a directory already in $PATH",
  181. "do nothing",
  182.     };
  183.     int def;
  184.     int select;
  185.     int exe;
  186.     FILE *fd;
  187.     char cwd[1000];
  188.     if (
  189. #ifdef WIN32
  190. _getcwd
  191. #else
  192. getcwd
  193. #endif
  194. (cwd, 1000) == NULL)
  195.     {
  196. printf("ERROR: Cannot get name of current directoryn");
  197. exit(1);
  198.     }
  199.     /*
  200.      * Ask the user if he really wants to install Vim.
  201.      */
  202.     printf("This program will set up the installation of Vimn");
  203.     printf("It prepares the _vimrc file, $VIM and the executables.n");
  204.     printf("Do you want to continue? (Y/N) ");
  205.     if (scanf(" %c", answer) < 1 || toupper(answer[0]) != 'Y')
  206. exit(0);
  207.     /*
  208.      * Ask for contents of _vimrc.
  209.      */
  210.     def = get_choice(def_choices, TABLE_SIZE(def_choices));
  211.     select = get_choice(select_choices, TABLE_SIZE(select_choices));
  212.     printf("nYou have chosen:n");
  213.     printf("[%d] %sn", def, def_choices[def]);
  214.     printf("[%d] %sn", select, select_choices[select]);
  215.     if ((fd = fopen("_vimrc", "r")) != NULL)
  216.     {
  217. fclose(fd);
  218. printf("nThere already exists a _vimrc in the current directory.");
  219. printf("nDo you want to overwrite it? (Y/N) ");
  220.     }
  221.     else
  222. printf("nDo you want to write the _vimrc in the current directory? (Y/N) ");
  223.     if (scanf(" %c", answer) < 1 || toupper(answer[0]) != 'Y')
  224. printf("Skipping writing of _vimrcn");
  225.     else
  226.     {
  227. fd = fopen("_vimrc", "w");
  228. if (fd == NULL)
  229. {
  230.     printf("ERROR: Cannot open _vimrc for writingn");
  231.     exit(1);
  232. }
  233. switch (def)
  234. {
  235.     case 1:     fprintf(fd, "set nocompatiblen");
  236. break;
  237.     case 2:     fprintf(fd, "set nocompatiblen");
  238. fprintf(fd, "source $VIM/vimrc_examplen");
  239. break;
  240.     case 3:     fprintf(fd, "set compatiblen");
  241. break;
  242. }
  243. switch (select)
  244. {
  245.     case 1: fprintf(fd, "behave xtermn");
  246. break;
  247.     case 2: fprintf(fd, "source $VIM/mswin.vimn");
  248. break;
  249.     case 3: fprintf(fd, "behave xtermn");
  250. fprintf(fd, "set selectmode=mousen");
  251. break;
  252. }
  253. fclose(fd);
  254. printf("_vimrc has been writtenn");
  255.     }
  256.     /*
  257.      * Set $VIM somehow
  258.      */
  259.     printf("nI can append a command to c:\autoexec.bat to set $VIM.n");
  260.     printf("(this will not work if c:\autoexec.bat contains sections)n");
  261.     printf("Do you want me to append to your c:\autoexec.bat? (Y/N) ");
  262.     if (scanf(" %c", answer) < 1 || toupper(answer[0]) != 'Y')
  263. printf("Skipping appending to c:\autoexec.batn");
  264.     else
  265. append_autoexec("set VIM=%sn", cwd);
  266.     /*
  267.      * Set PATH or move executables.
  268.      */
  269.     printf("nTo be able to run Vim it must be in your $PATH.");
  270.     exe = get_choice(exe_choices, TABLE_SIZE(exe_choices));
  271.     switch (exe)
  272.     {
  273. case 1:     append_autoexec("set PATH=%%PATH%%;%sn", cwd);
  274.     break;
  275. case 2:     move_to_path();
  276.     break;
  277. case 3:     printf("Skipping setting $PATHn");
  278.     break;
  279.     }
  280.     printf("nThat finishes the installation.  Happy Vimming!n");
  281.     return 0;
  282. }