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