home *** CD-ROM | disk | FTP | other *** search
/ C++ Games Programming / CPPGAMES.ISO / povnet / povnet.c < prev    next >
C/C++ Source or Header  |  1995-02-09  |  2KB  |  92 lines

  1. // --- povnet.c
  2. //     compile with Borland C
  3.  
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <dir.h>
  7. #include <string.h>
  8. #include <process.h>
  9. #include <dos.h>
  10. #include <io.h>
  11. #include <errno.h>
  12.  
  13. void render(char *povname)
  14. {
  15.     char def[20], *defp = def;
  16.     int c;
  17.     FILE *fd, *fp, *fo;
  18.     int oldstderr;
  19.     char tmp[20], err[20];
  20.     *(povname+strlen(povname)-4) = '\0';
  21.     // --- use model's .def file or default.def
  22.     strcpy(def, povname);
  23.     strcat(def, ".def");
  24.     if (access(def, 0) != 0)
  25.         defp = "default.def";
  26.     // ---- build .def file
  27.     fo = fopen("povray.def", "wt");
  28.     fd = fopen(defp, "rt");
  29.     while ((c = fgetc(fd)) != EOF)
  30.         fputc(c, fo);
  31.     fprintf(fo, " -i%s.pov\n -o%s.tga\n +@%s.out\n -d\n", povname, povname, povname);
  32.     fclose(fd);
  33.     fclose(fo);
  34.     // --- build .tmp file to receive stderr output
  35.     strcpy(tmp, povname);
  36.     strcat(tmp, ".tmp");
  37.     fp = fopen(tmp, "wt");
  38.     // --- remove previous .err file
  39.     strcpy(err, povname);
  40.     strcat(err, ".err");
  41.     remove(err);
  42.     // ---- redirect stderr to .tmp file
  43.     oldstderr = dup(fileno(stderr));
  44.     dup2(fileno(fp), fileno(stderr));
  45.     printf("\n\aRendering %s\n", povname);
  46.     spawnlp(P_WAIT, "povray.exe", "povray.exe", "povray.def", NULL);
  47.     // --- un-redirect stderr
  48.     dup2(fileno(stderr), oldstderr);
  49.     fclose(fp);
  50.     // ---- copy redirected stderr .tmp file to .err file
  51.     fp = fopen(tmp, "rt");
  52.     fo = fopen(err, "wt");
  53.     while ((c = fgetc(fp)) != EOF)
  54.         fputc(c, fo);
  55.     fclose(fp);
  56.     fclose(fo);
  57.     // ---- delete the .tmp file
  58.     remove(tmp);
  59.     // --- turn off archive attribute in .pov file
  60.     *(povname+strlen(povname)) = '.';
  61.     _rtl_chmod(povname, 1, _rtl_chmod(povname, 0) & (~FA_ARCH));
  62.     putchar('\n');
  63. }
  64. int wait(void)
  65. {
  66.     int i;
  67.     for (i = 0; i < 5; i++)    {
  68.         putchar('.');
  69.         if (kbhit())    {
  70.             if (getch() == 27)
  71.                 return 1;
  72.         }
  73.         sleep(1);
  74.     }
  75.     return 0;
  76. }
  77. int main()
  78. {
  79.     int ax;
  80.     struct ffblk ff;
  81.     do    {
  82.         printf("\rScanning for POVs (Esc to quit)      \b\b\b\b\b");
  83.         ax = findfirst("*.pov", &ff, 0);
  84.         while (ax != -1)    {
  85.             if (ff.ff_attrib && FA_ARCH)
  86.                 render(ff.ff_name);
  87.             ax = findnext(&ff);
  88.         }
  89.     } while (!wait());
  90.     return 0;
  91. }
  92.