D - something evil with array concatenation in recursive functions
- Ruslanas Abdrachimovas (62/62) Jun 21 2002 Hello,
- Andrew Edwards (82/82) Jun 21 2002 not much I can do for you Ruslanas but I did notice several [%s] which
- Dario (3/7) Jun 22 2002 You are not mistaking. D strings are not guaranteed to be zero-terminate...
Hello, I have a proble running this code: ========================================================= void getAllFiles(char[] dir, List lst, char[] name) { WIN32_FIND_DATA currentFileData; printf("Search root [%s]\n", (char*)dir); char[] searchName = dir[0..dir.length]; searchName ~= "\\*.*"; // this line works only first time :((((( printf("Search name [%s]\n", (char*)searchName); HANDLE search = FindFirstFileA((char*)searchName, ¤tFileData); if (search == INVALID_HANDLE_VALUE) { printf("Invalid handle returning.\n\n"); FindClose(search); return; } BOOL next = true; while (next != false) { printf("Found file base name [%s]\n", (char*)currentFileData.cFileName); if (strcmp(currentFileData.cFileName, ".") != 0 && strcmp(currentFileData.cFileName, "..") != 0) { //if ((currentFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == FILE_ATTRIBUTE_DIRECTORY) && // (currentFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE != FILE_ATTRIBUTE_ARCHIVE)) char[] fullPath = dir ~ '\' ~ currentFileData.cFileName; printf("Found file full name [%s]\n", (char*)fullPath); printf("\tAttributes [0x%08xh]\n", GetFileAttributesA((char*)fullPath)); printf("\tMasked [0x%08xh]\n", (GetFileAttributesA((char*)fullPath) & FILE_ATTRIBUTE_DIRECTORY)); if ((GetFileAttributesA((char*)fullPath) & FILE_ATTRIBUTE_DIRECTORY) != 0) { printf("Is directory\n"); getAllFiles(fullPath, lst, name); } else { printf("Is file\n"); printf("Adding new item to list\n"); Item itm = new Item(); int len = strlen(currentFileData.cFileName); itm.str = new char[len]; itm.str[0..len] = currentFileData.cFileName[0..len]; lst.add(itm); } } printf("Search next file\n"); next = FindNextFileA(search, ¤tFileData); printf("\n"); } FindClose(search); } ========================================================= Maybe some body knows what the problem is? Ruslanas
Jun 21 2002
not much I can do for you Ruslanas but I did notice several [%s] which should read [%.*s] in order to process correctly in D if I'm not mistaking! Can someone back me up on this one? Andrew "Ruslanas Abdrachimovas" <anubis 03bar.ktu.lt> wrote in message news:3D132DD8.6090605 03bar.ktu.lt... | Hello, | | I have a proble running this code: | | ========================================================= | void getAllFiles(char[] dir, List lst, char[] name) | { | WIN32_FIND_DATA currentFileData; | | printf("Search root [%s]\n", (char*)dir); | | char[] searchName = dir[0..dir.length]; | searchName ~= "\\*.*"; // this line works only first time :((((( | printf("Search name [%s]\n", (char*)searchName); | HANDLE search = FindFirstFileA((char*)searchName, | ¤tFileData); | | if (search == INVALID_HANDLE_VALUE) | { | printf("Invalid handle returning.\n\n"); | FindClose(search); | return; | } | | BOOL next = true; | while (next != false) | { | printf("Found file base name [%s]\n", | (char*)currentFileData.cFileName); | | if (strcmp(currentFileData.cFileName, ".") != 0 && | strcmp(currentFileData.cFileName, "..") != 0) | { | //if ((currentFileData.dwFileAttributes & | FILE_ATTRIBUTE_DIRECTORY == FILE_ATTRIBUTE_DIRECTORY) && | // (currentFileData.dwFileAttributes & | FILE_ATTRIBUTE_ARCHIVE != FILE_ATTRIBUTE_ARCHIVE)) | char[] fullPath = dir ~ '\' ~ currentFileData.cFileName; | printf("Found file full name [%s]\n", (char*)fullPath); | | printf("\tAttributes [0x%08xh]\n", | GetFileAttributesA((char*)fullPath)); | printf("\tMasked [0x%08xh]\n", | (GetFileAttributesA((char*)fullPath) & FILE_ATTRIBUTE_DIRECTORY)); | if ((GetFileAttributesA((char*)fullPath) & | FILE_ATTRIBUTE_DIRECTORY) != 0) | { | printf("Is directory\n"); | getAllFiles(fullPath, lst, name); | } | else | { | printf("Is file\n"); | printf("Adding new item to list\n"); | | Item itm = new Item(); | int len = strlen(currentFileData.cFileName); | itm.str = new char[len]; | itm.str[0..len] = currentFileData.cFileName[0..len]; | lst.add(itm); | } | } | | printf("Search next file\n"); | next = FindNextFileA(search, ¤tFileData); | printf("\n"); | } | | FindClose(search); | } | ========================================================= | | Maybe some body knows what the problem is? | | Ruslanas |
Jun 21 2002
not much I can do for you Ruslanas but I did notice several [%s] which should read [%.*s] in order to process correctly in D if I'm notmistaking!Can someone back me up on this one? AndrewYou are not mistaking. D strings are not guaranteed to be zero-terminated C strings: only text between quotes ("blah" and 'blah') have an appended \0.
Jun 22 2002