reading HEX and OCTAL numbers from input field
Primorec
igor.furlan at gmail.com
Fri Sep 24 01:05:36 CDT 2004
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