MSVCRT: Still problems in ASCII Mode

Dan Kegel dank at kegel.com
Tue Feb 3 16:09:51 CST 2009


Thanks.
Please don't use rand() in testcases, though.
Would a constant 'a' suffice in this case?

Which app did you find this in, btw?

On Tue, Feb 3, 2009 at 1:55 PM, Uwe Bonnes
<bon at elektron.ikp.physik.tu-darmstadt.de> wrote:
> Hello,
>
> it seems that in ASCII mode, fseek() may disturb reading. Appended patch
> adds a todo_wine.
>
> Bye
> --
> Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de
>
> Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
> --------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
> diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
> index 9032e51..2a72212 100644
> --- a/dlls/msvcrt/tests/file.c
> +++ b/dlls/msvcrt/tests/file.c
> @@ -306,7 +306,8 @@ static void test_asciimode(void)
>  {
>     FILE *fp;
>     char buf[64];
> -    int c, i, j;
> +    int c, i, j, done, count1, count2;
> +
>
>     /* Simple test of CR CR LF handling.  Test both fgets and fread code paths, they're different! */
>     fp = fopen("ascii.tst", "wb");
> @@ -372,6 +373,46 @@ static void test_asciimode(void)
>     ok((c = fgetc(fp)) == '1', "fgetc fails to read next char when positioned on \\r\n");
>     fclose(fp);
>
> +    fp= fopen("ascii.tst","wb");
> +    for (i=0; i<1000; i++)
> +      {
> +       unsigned char c = (rand()+ ' ') & 0x7f;
> +       if (isgraph(c) || (c == ' '))
> +         fputc(c, fp);
> +       else if ((c == '\r') || (c == '\n'))
> +         fputs("\r\n", fp);
> +      }
> +    fclose(fp);
> +
> +    done = 0;
> +    count1 = 0;
> +
> +    fp = fopen("ascii.tst", "r");
> +    while (!done)
> +      {
> +       c= fgetc(fp);
> +       if (c == EOF)
> +         done =  1;
> +       else if (isalnum(c))
> +         count1 ++;
> +      }
> +    fclose(fp);
> +
> +    done = 0;
> +    count2 = 0;
> +
> +    fp = fopen("ascii.tst", "r");
> +    while (!done)
> +      {
> +       c= fgetc(fp);
> +       fseek(fp, 0, SEEK_CUR);
> +       if (c == EOF)
> +         done =  1;
> +       else if (isalnum(c))
> +         count2 ++;
> +     }
> +    fclose(fp);
> +    todo_wine ok((count1 == count2), "fseek caused short read %d vs %d\n", count2, count1);
>     unlink("ascii.tst");
>  }
>
>



More information about the wine-devel mailing list