static DWORD __apxMultiSzToJvmOptions()

in src/native/windows/src/javajni.c [506:555]


static DWORD __apxMultiSzToJvmOptions(APXHANDLE hPool,
                                      LPCSTR lpString,
                                      LPCSTR lpString9,
                                      JavaVMOption **lppArray,
                                      DWORD  nExtra,
                                      DWORD bJniVfprintf)
{
    DWORD i = 0, n = 0, n9 = 0, nTotal, l = 0, l9 = 0, lTotal;
    char *buff;
    LPSTR p;

    if (lpString) {
        l = __apxGetMultiSzLengthA(lpString, &n);
    }
    if (__apxIsJava9() && lpString9) {
        l9 = __apxGetMultiSzLengthA(lpString9, &n9);
    }

    nTotal = n + n9 + nExtra;
    lTotal = l + l9;

    buff = apxPoolAlloc(hPool, (nTotal + 1) * sizeof(JavaVMOption) + (lTotal + 1));

    *lppArray = (JavaVMOption *)buff;
    p = (LPSTR)(buff + (nTotal + 1) * sizeof(JavaVMOption));
    if (lpString)
        AplCopyMemory(p, lpString, l + 1);
    if (bJniVfprintf) {
        // If present, vfprintf is set first so it can be used to report errors
        // in later options. Increment indexes to account for this.
        i++;
        n++;
    }
    for (; i < n; i++) {
        (*lppArray)[i].optionString = p;
        while (*p)
            p++;
        p++;
    }
    if (lpString9)
        AplCopyMemory(p, lpString9, l9 + 1);
    for (; i < (n + n9); i++) {
        (*lppArray)[i].optionString = p;
        while (*p)
            p++;
        p++;
    }

    return nTotal;
}