reading HEX and OCTAL numbers from input field
Primorec
igor.furlan at gmail.com
Fri Sep 24 01:56:32 CDT 2004
Just forget my post.. I have not noticed that this feature was
already implemented.
Yes, I've put brown bag over my head
On Thu, 23 Sep 2004 23:05:36 -0700, Primorec <igor.furlan at gmail.com> wrote:
> This patch allows user to enter HEX and/or OCTAL numbers into the form
> input field.
>
> This is my first patch and in the same time my second C program (first
> one was Hello World).
> So, please, have a mercy and be tolerant.
>
> Thanks
>
> Igor
>
> ? patch.diff
> Index: dlls/oleaut32/variant.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
> retrieving revision 1.102
> diff -u -u -r1.102 variant.c
> --- dlls/oleaut32/variant.c 22 Sep 2004 19:12:18 -0000 1.102
> +++ dlls/oleaut32/variant.c 24 Sep 2004 05:44:43 -0000
> @@ -1556,6 +1556,8 @@
> DWORD dwState = B_EXPONENT_START|B_INEXACT_ZEROS;
> int iMaxDigits = sizeof(rgbTmp) / sizeof(BYTE);
> int cchUsed = 0;
> + int value = 0;
> + OLECHAR first_element;
>
> TRACE("(%s,%ld,0x%08lx,%p,%p)\n", debugstr_w(lpszStr), lcid,
> dwFlags, pNumprs, rgbDig);
>
> @@ -1571,6 +1573,73 @@
> pNumprs->nBaseShift = 0;
> pNumprs->nPwr10 = 0;
>
> + first_element = *lpszStr++;
> +
> + if ((first_element == '&') && (pNumprs->dwInFlags & NUMPRS_HEX_OCT))
> + {
> + /* printf("TONY's hex string %s \n", debugstr_w(lpszStr)); */
> +
> + first_element = *lpszStr++;
> +
> + if (first_element == 'h' || first_element == 'H')
> + {
> + pNumprs->nBaseShift = 4; /* hex number */
> + first_element = *lpszStr++;
> + }
> + else
> + {
> + pNumprs->nBaseShift = 3; /* octal number */
> +
> + if (first_element == 'o' || first_element == '0')
> + {
> + first_element = *lpszStr++;
> + }
> + }
> +
> + while (first_element == '0')
> + first_element = *lpszStr++;
> +
> + while (first_element != 0)
> + {
> + if (pNumprs->nBaseShift == 4)
> + {
> + if (first_element >= 'a' && first_element <= 'f')
> + value = first_element - 'a' + 10; /* making integer value
> out of hex character */
> + else if (first_element >= 'A' && first_element <= 'F')
> + value = first_element - 'A' + 10; /* making integer value
> out of hex character */
> + else if (first_element >= '0' && first_element <= '9')
> + value = first_element - '0';
> + }
> + else
> + {
> + if (first_element >= '0' && first_element <= '7')
> + value = first_element - '0';
> + }
> + rgbTmp[cchUsed] = value;
> + cchUsed++; /* count digits */
> + first_element = *lpszStr++;
> + }
> +
> + if (cchUsed == 0)
> + {
> + value = 0;
> + rgbTmp[cchUsed] = value;
> + cchUsed = 1;
> + }
> +
> + pNumprs->cDig = cchUsed;
> +
> + memcpy(rgbDig, rgbTmp, pNumprs->cDig * sizeof(BYTE));
> + return S_OK;
> + }
> +
> + if (!pNumprs || !rgbDig)
> + return E_INVALIDARG;
> +
> + if (pNumprs->cDig < iMaxDigits)
> + iMaxDigits = pNumprs->cDig;
> +
> +
> if (!lpszStr)
> return DISP_E_TYPEMISMATCH;
>
> @@ -1971,6 +2040,26 @@
>
> if (pNumprs->nBaseShift)
> {
> +
> + /* we have to be sure that the number does not use more than 32 bits
> + * I am not sure if this is 100% valid - perhaps we should test for 64 ?? */
> + int bitCount = (pNumprs->nBaseShift) * (pNumprs->cDig);
> + if (bitCount > 32)
> + return DISP_E_OVERFLOW;
> +
> + ULONG intValue = 0;
> + for ( ; pNumprs->cDig > 0; pNumprs->cDig--)
> + intValue = (intValue << (pNumprs->nBaseShift)) + *rgbDig++;
> +
> + FIXME("Only VTBIT_I2 implemented. Need to add other cases :
> VTBIT_I1, VTBIT_UI1 ... etc \n");
> + if (dwVtBits & VTBIT_I2)
> + {
> + V_VT(pVarDst) = VT_I2;
> + V_I2(pVarDst) = intValue;
> + return S_OK;
> + }
> +
> +
> /* nBaseShift indicates a hex or octal number */
> ULONG64 ul64 = 0;
> LONG64 l64;
>
More information about the wine-patches
mailing list