Borut Razem <borut.razem(a)siol.net> writes:
+static void msvcrt_add_handle(MSVCRT_FILE *fp, HANDLE *hProcess) +{ + LOCK_POPEN; + if (fp2handle == NULL) + { + /* array not allocated yet: allocate it */ + if ((fp2handle = MSVCRT_malloc(sizeof (struct fp2handle_s) * 16)) != NULL) + { + /* write handles to the first slot */ + fp2handle[0].fp = fp; + fp2handle[0].hProcess = hProcess; + + /* zero the remaining space */ + memset(&fp2handle[1], 0, sizeof (struct fp2handle_s) * (16 - 1)); + + /* update the number of slots */ + fp2handle_entries = 16; + } + } + else + { + int i; + + /* search for free or slot with the same fp */ + for (i = 0; i < fp2handle_entries; ++i) + { + if (fp2handle[i].fp == NULL || fp2handle[i].fp == fp) + { + /* found: write handles to the slot */ + fp2handle[i].fp = fp; + fp2handle[i].hProcess = hProcess; + break; + } + } + if (i >= fp2handle_entries) + { + /* no space left: double the array size */ + struct fp2handle_s *newFp2handle; + + if ((newFp2handle = MSVCRT_realloc(fp2handle, sizeof (struct fp2handle_s) * (fp2handle_entries * 2))) != NULL) + { + fp2handle = newFp2handle; + + /* write handles to the first exetended slot */ + fp2handle[fp2handle_entries].fp = fp; + fp2handle[fp2handle_entries].hProcess = hProcess; + + /* zero the remaining extended space */ + memset(&fp2handle[fp2handle_entries + 1], 0, sizeof (struct fp2handle_s) * (fp2handle_entries - 1)); + + /* update the number of slots */ + fp2handle_entries *= 2; + } + } + } + UNLOCK_POPEN; +}
That's an awful lot of code for such a simple thing. You probably want to use an array indexed by file descriptor or something like that. Also please don't add a comment before every line stating what the line does, that should be clear from the code itself. -- Alexandre Julliard julliard(a)winehq.org