Aric Stewart : regedit: Check for unicode file without using fseek.

Alexandre Julliard julliard at winehq.org
Mon Mar 17 10:46:40 CDT 2008


Module: wine
Branch: master
Commit: 58801f0d73deca571b984b1d8d40863d8ea7adef
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=58801f0d73deca571b984b1d8d40863d8ea7adef

Author: Aric Stewart <aric at codeweavers.com>
Date:   Sat Mar 15 16:04:59 2008 +0900

regedit: Check for unicode file without using fseek.

---

 programs/regedit/regproc.c |   40 ++++++++++++++++++++++++++++++----------
 1 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 9ee6765..85ab36b 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -484,21 +484,14 @@ void processRegLines(FILE *in)
 {
     LPSTR line           = NULL;  /* line read from input stream */
     ULONG lineSize       = REG_VAL_BUF_SIZE;
-    BYTE  uni[2];
+    BOOL  unicode_check  = TRUE;
 
     line = HeapAlloc(GetProcessHeap(), 0, lineSize);
     CHECK_ENOUGH_MEMORY(line);
 
-    if (fread(uni, 2, 1, in) == 1) {
-        if (uni[0] == 0xff && uni[1] == 0xfe) {
-            printf("Trying to import from a unicode file: this isn't supported yet.\n"
-                   "Please use export as Win 9x/NT4 files from native regedit\n");
-            return;
-        }
-        fseek(in, -2, SEEK_CUR);
-    }
     while (!feof(in)) {
         LPSTR s; /* The pointer into line for where the current fgets should read */
+        LPSTR check;
         s = line;
         for (;;) {
             size_t size_remaining;
@@ -527,7 +520,34 @@ void processRegLines(FILE *in)
              * eof, error, eol or getting the maximum amount.  Abort on error.
              */
             size_to_get = (size_remaining > INT_MAX ? INT_MAX : size_remaining);
-            if (NULL == fgets (s, size_to_get, in)) {
+
+            if (unicode_check)
+            {
+                if (fread( s, 2, 1, in) == 1)
+                {
+                    if ((BYTE)s[0] == 0xff && (BYTE)s[1] == 0xfe)
+                    {
+                        printf("Trying to import from a unicode file: this isn't supported yet.\n"
+                               "Please use export as Win 9x/NT4 files from native regedit\n");
+                        HeapFree(GetProcessHeap(), 0, line);
+                        return;
+                    }
+                    else
+                    {
+                        unicode_check = FALSE;
+                        check = fgets (&s[2], size_to_get-2, in);
+                    }
+                }
+                else
+                {
+                    unicode_check = FALSE;
+                    check = NULL;
+                }
+            }
+            else
+                check = fgets (s, size_to_get, in);
+
+            if (check == NULL) {
                 if (ferror(in)) {
                     perror ("While reading input");
                     exit (IO_ERROR);




More information about the wine-cvs mailing list