[MSVCRT #4]Don't fragment WriteFile() for _write TEXT mode

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Sun Oct 5 09:57:46 CDT 2003


Changelog:
	dlls/msvcrt/file.c: _write()
	Don't fragment WriteFile() for _write TEXT mode
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
--- wine/dlls/msvcrt/file.c_read	2003-10-05 13:55:37.000000000 +0200
+++ wine/dlls/msvcrt/file.c	2003-10-05 16:57:12.000000000 +0200
@@ -1546,34 +1546,59 @@
     }
   else
     {
+      unsigned int i, j, nr_lf;
       char *s=(char*)buf, *buf_start=(char*)buf, *p;
-      char crlf[]= {'\r','\n'};
-      unsigned int i;
-      DWORD num_to_write;
-      for (i = 0; i< count && !(MSVCRT_flags[fd] & MSVCRT__IOERR);i++, s++)
+      /* find number of \n ( without preceeding \r */
+      for ( nr_lf=0,i = 0; i <count; i++)
 	{
-	  if (*s == '\n')
+	  if (s[i]== '\n')
 	    {
-	      p = crlf;
-	      num_to_write = 2;
+	      nr_lf++;
+	      /*if ((i >1) && (s[i-1] == '\r'))	nr_lf--; */
+	    }
+	}
+      if (nr_lf)
+	{
+	  if ((p = (char*)MSVCRT_malloc(count + nr_lf)))
+	    {
+	      for(s=(char*)buf, i=0, j=0; i<count; i++)
+		{
+		  if (s[i]== '\n')
+		    {
+		      p[j++] = '\r';
+		      /*if ((i >1) && (s[i-1] == '\r'))j--;*/
+		    }
+		  p[j++] = s[i];
+		}
 	    }
 	  else
 	    { 
-	      p = s;
-	      num_to_write = 1;
+	      FIXME("Malloc failed\n");
+	      nr_lf =0;
+	      p = (char*)buf;
+	    }
 	    }
-	  if ((WriteFile(hand, p, num_to_write, &num_written, NULL) == 0 ) || (num_written != num_to_write))
+      else
+	p = (char*)buf;
+      
+      if ((WriteFile(hand, p, count+nr_lf, &num_written, NULL) == 0 ) || (num_written != count+nr_lf))
 	    {
 	      TRACE(":failed-last error (%ld) num_written %ld\n",GetLastError(),num_written);
 	      if (MSVCRT_files[fd])
 		{
 		  MSVCRT_files[fd]->_flag |= MSVCRT__IOERR;
 		  *MSVCRT__errno() = MSVCRT_ENOSPC;
+	      if(nr_lf)
+		MSVCRT_free(p);
 		  return s - buf_start;
 		}
 	    }
+      else
+	{
+	  if(nr_lf)
+	    MSVCRT_free(p);
+	  return count;
 	}
-      return s - buf_start;
     }
   return -1;
 }



More information about the wine-patches mailing list