delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2011/11/01/19:37:24

X-Recipient: archive-cygwin AT delorie DOT com
X-SWARE-Spam-Status: No, hits=1.0 required=5.0 tests=AWL,BAYES_50,RP_MATCHES_RCVD
X-Spam-Check-By: sourceware.org
X-EN-OrigOutIP: 10.20.18.16
X-EN-IMPSID: rzd01h0050LoEWa01zd0tf
From: "Leon Vanderploeg" <leonv AT vaultnow DOT com>
To: <cygwin AT cygwin DOT com>
References:
In-Reply-To:
Subject: Possible Bug ???
Date: Tue, 1 Nov 2011 17:36:50 -0600
Message-ID: <0ed501cc98ef$21fbd660$65f38320$@vaultnow.com>
MIME-Version: 1.0
X-EN-UserInfo: ca4eb83b29c199dc675fd93de881b90e:2283ef65109048eed6984feda31515c6
X-EN-AuthUser: leonv AT vaultnow DOT com
X-EN-OrigIP: 24.8.203.182
X-EN-OrigHost: c-24-8-203-182.hsd1.co.comcast.net
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id pA1NbKYM021631

Greetings,

This issue is making my head flat from pounding it against the wall.  It appears to be a bug in Cygwin 1.7, but I can't say with any certainty.  I've been down too many dead end trails already...

With cygwin 1.7.5, file name with a special characters such as ñ (n with tidle above it) fail be properly extracted from a WIN32_FIND_DATA structure with findFirstFile (or findNextFile).

To set up a simple test scenario, I created a file in C:\Testing named  Mañana.docx.  I compiled the code at the end of this message on Cygwin 1.7.9 with GCC version 3.4.4.

On the Cygwin 1.7.9 machine, it returns:
$ ./winfilestat3.exe
hFind filename is ***Maâ–’ana.docx***
hFind file name stat return code is: -1
character 0 is M
character 0 is  signed int 77, hex 4d
character 1 is a
character 1 is  signed int 97, hex 61
character 2 is â–’
character 2 is  signed int -15, hex fffffff1
character 3 is a
character 3 is  signed int 97, hex 61
character 4 is n
character 4 is  signed int 110, hex 6e
character 5 is a
character 5 is  signed int 97, hex 61
character 6 is .
character 6 is  signed int 46, hex 2e
character 7 is d
character 7 is  signed int 100, hex 64
character 8 is o
character 8 is  signed int 111, hex 6f
character 9 is c
character 9 is  signed int 99, hex 63

NOTE that the ñ is interpreted as ▒, and the stat fails.

I moved the compiled program to another PC running Cygwin 1.5.25.  It CORRECTLY returns:
bash-3.2$ ./winfilestat3.exe
hFind filename is ***Mañana.docx***
hFind file name stat return code is: 0
character 0 is M
character 0 is  signed int 77, hex 4d
character 1 is a
character 1 is  signed int 97, hex 61
character 2 is ñ
character 2 is  signed int -15, hex fffffff1
character 3 is a
character 3 is  signed int 97, hex 61
character 4 is n
character 4 is  signed int 110, hex 6e
character 5 is a
character 5 is  signed int 97, hex 61
character 6 is .
character 6 is  signed int 46, hex 2e
bash-3.2$ 

Note the ñ is correct, and the stat succeeds.

Is this a bug, or do I need to set something up special on Cygwin 1.7 to get it to work the way it used to?

Thanks in advance,
Leon


**start of code****************************
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <winbase.h>
#include <sys/types.h>
#include <fcntl.h>
#include <dirent.h>
#include <curl/curl.h>
#include <pthread.h>
#include <wctype.h>

#include <sys/wait.h>
#include <cygwin/wait.h>

struct stat fileStat;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;

                
int main(int argc, char **argv)
{
                char filename[100];
                int rtn, i;
                char chr;
                
                
                /*
    if(argc != 2)   
                {
                                printf("arg1 is required\n"); 
        return(1);
                }
                
                */
/*
//hard coded cyg
                wcscpy(filename, "/cygdrive/c/Testing/Mañana.docx");
                printf("Hard coded cyg filename is ***%s***\n",filename);
                
                rtn = wstat(filename,&fileStat);
    printf("hard coded cyg file name stat return code is: %d\n", rtn);

                for ( i = 0 ; i < wcslen(filename) ; i++ )
                {
                                printf("character %d is %c\n", i, filename[i] );
                                printf("character %d is  signed int %d, hex %x \n", i, filename[i], filename[i] );

                }
                
                
                
//hard coded Win
                wcscpy(filename, "C:\\Testing\\Mañana.docx");
                printf("Hard coded win filename is ***%s***\n",filename);
                
                rtn = wstat(filename,&fileStat);
    printf("hard coded win file name stat return code is: %d\n", rtn);

                for ( i = 0 ; i < wcslen(filename) ; i++ )
                {
                                printf("character %d is %c\n", i, filename[i] );
                                printf("character %d is  signed int %d, hex %x \n", i, filename[i], filename[i] );

                }
                
                
                */
                
/*
                
//from argv[1]
                strcpy(filename, argv[1]);
                printf("argv[1] is\n%s\n", filename);
                
                rtn = stat(filename,&fileStat);
    printf("argv[1] stat return code is: %d\n", rtn);
                
                for ( i = 0 ; i < wcslen(filename) ; i++ )
                {
                                printf("character %d is %c\n", i, filename[i] );
                                printf("character %d is  signed int %d, hex %x \n", i, filename[i], filename[i] );

                }

                printf("arg1 is ***%s***\n", argv[1]);

    rtn = stat(argv[1],&fileStat);
    printf("exit code is: %d\n", rtn);

*/

//find file
                char pathSearch[300];
                sprintf(pathSearch, "C:\\Testing\\*.docx");
                hFind = FindFirstFile(pathSearch, &FindFileData);
                if (hFind == INVALID_HANDLE_VALUE)
                {
                                printf("Warning: No .docx file found in the directory.  Exiting.\n");
                                return(1);
                }
                strcpy(filename, FindFileData.cFileName);
                printf("hFind filename is ***%s***\n",filename);
                
                rtn = stat(filename,&fileStat);
    printf("hFind file name stat return code is: %d\n", rtn);

                for ( i = 0 ; i < wcslen(filename) ; i++ )
                {
                                printf("character %d is %c\n", i, filename[i] );
                                printf("character %d is  signed int %d, hex %x \n", i, filename[i], filename[i] );
                }

    return(0);
}

**end of code****************************

Leon Vanderploeg
Cell   303-877-9654







--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019