Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add the new integrated files version (use xbt data structures instead my own data...
[simgrid.git] / tools / tesh2 / w32 / src / Cat.c
diff --git a/tools/tesh2/w32/src/Cat.c b/tools/tesh2/w32/src/Cat.c
new file mode 100644 (file)
index 0000000..06f24c7
--- /dev/null
@@ -0,0 +1,309 @@
+
+
+/* must be defined before */
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_DEPRECATE 
+#endif
+
+#include <windows.h>
+
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <io.h>
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_DEPRECATE 
+#define strdup _strdup
+#define fileno _fileno
+#define creat  _creat
+#define open   _open
+#define read   _read
+#define write  _write
+#endif
+
+#ifdef max
+       #undef max
+       #define max(h,i) ((h) > (i) ? (h) : (i))
+#endif
+       
+#ifndef S_ISREG
+       #define S_ISREG(__mode) (((__mode) & S_IFMT) == S_IFREG)
+#endif
+
+#ifndef STDIN_FILENO
+#define STDIN_FILENO   0
+#endif
+
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO  1
+#endif
+
+
+static 
+int exit_code = EXIT_SUCCESS;
+
+static char*
+rfname;
+
+static char*
+wfname = NULL;
+
+static
+int wfd;
+
+#ifndef _MSC_VER
+static size_t 
+#else
+static int
+#endif
+bsize;
+
+static char *
+buf = NULL;
+
+static int 
+fnumber = 0;
+
+int
+cat_files(char** fnames);
+
+int
+cat(int);
+
+char** 
+fnames = NULL;
+
+void
+exit0(int errcode)
+{
+       if(fnames)
+       {
+               int i;
+               
+               for(i = 0; i < fnumber; i++)
+                               free(fnames[i]);
+                               
+               free(fnames);
+       }
+       
+       if(buf)         
+               free(buf);
+               
+       if(wfname)
+               free(wfname);
+               
+       
+       exit(errcode);
+}
+
+int
+main(int argc, char *argv[])
+{
+       int i, j;
+       int success = 1;
+       int redirect = 0;
+       int exists = 0;
+       
+       struct stat stat_buf = {0};
+       
+       setlocale(LC_ALL, "");
+       
+       bsize = BUFSIZ; 
+               
+       if(!(buf = (char*)malloc(bsize)))
+       {
+               fprintf(stderr, "[ERROR/cat] not enough memory\n");
+               exit0(EXIT_FAILURE);
+       }
+       
+       if(argc > 1)
+       {
+               if(!(fnames = (char**)calloc(argc, sizeof(char*))))
+               {
+                       fprintf(stderr, "[ERROR/cat]  not enough memory\n");
+                       exit0(EXIT_FAILURE);
+               }
+               
+               for(i = 1, j= 0; i < argc; i++)
+               {
+                       if(!strcmp(argv[i], ">"))
+                       {
+                               redirect = 1;
+                               break;
+                       }
+                       else if(!strcmp(argv[i], ">>"))
+                       {
+                               redirect = 1;
+                               exists = 1;
+                               break;
+                       }
+                       else
+                       {
+                               if(stat(argv[i], &stat_buf))
+                               {
+                                       fprintf(stderr, "[ERROR/cat (1)] could not get information about %s\n",argv[i]);
+                                       success = 0;
+                                       break;
+                               }
+                               else
+                               {
+                                       if(S_ISREG(stat_buf.st_mode))
+                                       {
+                                               fnames[j++] = strdup(argv[i]);
+                                               fnumber++;      
+                                       }
+                                       else
+                                       {
+                                               fprintf(stderr, "[ERROR/cat] %s is not a file\n",argv[i]);
+                                               success = 0;
+                                               break;
+                                       }
+                               }       
+                       }               
+               }
+               
+               if(!success)
+                       exit0(EXIT_FAILURE);
+       }
+       
+       if(redirect)
+       {
+               if(i != argc - 2)
+               {
+                       if(exists)
+                               fprintf(stderr, "[ERROR/cat] syntax error near `>>' (i : %d - argc : %d\n", i , argc);
+                       else
+                               fprintf(stderr, "[ERROR/cat] syntax error near `>' (i : %d - argc : %d\n", i , argc);
+                                       
+                       exit0(EXIT_FAILURE);
+               }
+               else
+               {
+                       wfname = strdup(argv[i + 1]);
+                       
+                       if(!exists)
+                       {
+                               if((wfd = creat(wfname, _S_IREAD | _S_IWRITE)) < 0)
+                               {
+                                       fprintf(stderr, "[ERROR/cat] could not create %s file\n",wfname);
+                                       
+                                       exit0(EXIT_FAILURE);
+                               }       
+                       }
+                       else
+                       {
+                               if((wfd = open(wfname, O_WRONLY | O_APPEND, 0)) < 0)
+                               {
+                                       fprintf(stderr, "[ERROR/cat] could not open %s file\n",wfname);
+                                       
+                                       exit0(EXIT_FAILURE);
+                               }
+                       }
+               }                       
+       }
+       else
+       {
+               wfd = STDOUT_FILENO;
+               
+               if(fstat(wfd, &stat_buf))
+               {       
+                       fprintf(stderr, "[ERROR/cat (3)] could not get information about stdout\n");
+                       exit0(EXIT_FAILURE);
+               }
+       }
+       
+       exit_code = cat_files(fnames);
+       
+       if(wfd == STDOUT_FILENO)
+       {
+               if(fclose(stdout))
+               {
+                       fprintf(stderr, "[ERROR/cat] could not close stdout\n");
+                       exit_code = EXIT_FAILURE;
+               }
+       }
+       else
+       {
+               if(close(wfd))
+               {
+                       fprintf(stderr, "[ERROR/cat] could not close %s\n", wfname);
+                       exit_code = EXIT_FAILURE;
+               }       
+       }
+       
+       exit0(exit_code);
+}
+
+int
+cat_files(char **fnames)
+{
+       int rfd, i;
+       int failure = 0;
+       
+       rfd = STDIN_FILENO;
+       
+       rfname = "stdin";
+       
+       if(fnumber)
+       {
+               
+               for(i = 0; i < fnumber && !failure; i++) 
+               {
+                       if (!strcmp(fnames[i], "-"))
+                               rfd = fileno(stdin);
+                       else if ((rfd = open(fnames[i], O_RDONLY, 0)) < 0) 
+                       {
+                               fprintf(stderr, "[WARN/cat] could not open %s file", fnames[i]);
+                               exit_code = EXIT_FAILURE;
+                               continue;
+                       }
+                       
+                       rfname = fnames[i];
+                       
+                       failure = cat(rfd);
+                       
+                       close(rfd);
+                               
+               }
+       }
+       else
+               failure = cat(rfd);
+       
+       return failure ? 1 : 0;
+}
+
+int
+cat(int rfd)
+{
+
+       #ifndef _MSC_VER 
+       size_t bytes_readed_nb;
+       #else
+       int bytes_readed_nb;
+       #endif
+       int bytes_written_nb, pos;
+       
+       while ((bytes_readed_nb = read(rfd, buf, bsize)) != -1 && bytes_readed_nb != 0)
+       {
+               for (pos = 0; bytes_readed_nb; bytes_readed_nb -= bytes_written_nb, pos += bytes_written_nb)
+               {
+                       if ((bytes_written_nb = write(wfd, buf + pos, bytes_readed_nb)) == 0 || bytes_written_nb == -1)
+                       {
+                               fprintf(stderr, "[ERROR/cat] could not write to %s\n", wfd == fileno(stdout) ? "stdout" : wfname);
+                               return 1;
+                       }
+               }
+       }
+               
+       if(bytes_readed_nb < 0)
+       {
+               fprintf(stderr, "[WARN/cat] could not read %s file", rfname);
+               return 1;
+       }
+       
+       return 0;
+}