Thread overview
something evil with array concatenation in recursive functions
Jun 21, 2002
Andrew Edwards
Jun 22, 2002
Dario
June 21, 2002
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, &currentFileData);

    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, &currentFileData);
        printf("\n");
    }

    FindClose(search);
}
=========================================================

Maybe some body knows what the problem is?

Ruslanas

June 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,
| &currentFileData);
|
|      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, &currentFileData);
|          printf("\n");
|      }
|
|      FindClose(search);
| }
| =========================================================
|
| Maybe some body knows what the problem is?
|
| Ruslanas
|

June 22, 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

You 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.