winetest: enforce valid tag syntax during input

Ferenc Wagner wferi at tba.elte.hu
Wed Apr 13 06:20:24 CDT 2005


Hi,

Please point me in the right direction if this is not the
right/idiomatic way to constrain input in a text field.

Thanks,
Feri.

ChangeLog: Enforce valid tag syntax during input.

Index: programs/winetest/gui.c
===================================================================
RCS file: /home/wine/wine/programs/winetest/gui.c,v
retrieving revision 1.9
diff -u -p -r1.9 gui.c
--- programs/winetest/gui.c	11 Apr 2005 16:10:01 -0000	1.9
+++ programs/winetest/gui.c	13 Apr 2005 11:14:11 -0000
@@ -41,6 +41,8 @@ double progressScale;
  */
 int progressGroup;
 
+WNDPROC DefEditProc;
+
 char *
 renderString (va_list ap)
 {
@@ -319,21 +321,35 @@ guiAsk (va_list ap)
 }
 
 BOOL CALLBACK
+EditTagProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    switch (msg) {
+    case WM_CHAR:
+        if (wParam == 8) break; /* backspace is OK */
+        if (GetWindowTextLengthA (hwnd) == MAXTAGLEN ||
+            !goodtagchar (wParam)) return TRUE;
+        break;
+    }
+    return CallWindowProcA (DefEditProc, hwnd, msg, wParam, lParam);
+}
+
+BOOL CALLBACK
 AskTagProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     int len;
 
     switch (msg) {
+    case WM_INITDIALOG:
+        DefEditProc = (WNDPROC)SetWindowLongPtr
+            (GetDlgItem (hwnd, IDC_TAG), GWLP_WNDPROC, (LONG_PTR)EditTagProc);
+        return TRUE;
     case WM_COMMAND:
         switch (LOWORD (wParam)) {
         case IDOK:
             len = GetWindowTextLengthA (GetDlgItem (hwnd, IDC_TAG));
-            if (len <= MAXTAGLEN) {
-                tag = xmalloc (len+1);
-                GetDlgItemTextA (hwnd, IDC_TAG, tag, len+1);
-                if (!badtagchar (tag)) EndDialog (hwnd, IDOK);
-                else free (tag);
-            }
+            tag = xmalloc (len+1);
+            GetDlgItemTextA (hwnd, IDC_TAG, tag, len+1);
+            EndDialog (hwnd, IDOK);
             return TRUE;
         case IDABORT:
             EndDialog (hwnd, IDABORT);
Index: programs/winetest/main.c
===================================================================
RCS file: /home/wine/wine/programs/winetest/main.c,v
retrieving revision 1.35
diff -u -p -r1.35 main.c
--- programs/winetest/main.c	11 Apr 2005 16:10:01 -0000	1.35
+++ programs/winetest/main.c	13 Apr 2005 11:14:11 -0000
@@ -601,7 +601,7 @@ int WINAPI WinMain (HINSTANCE hInst, HIN
             if (strlen (tag) > MAXTAGLEN)
                 report (R_FATAL, "tag is too long (maximum %d characters)",
                         MAXTAGLEN);
-            cp = badtagchar (tag);
+            cp = findbadtagchar (tag);
             if (cp) {
                 report (R_ERROR, "invalid char in tag: %c", *cp);
                 usage ();
Index: programs/winetest/util.c
===================================================================
RCS file: /home/wine/wine/programs/winetest/util.c,v
retrieving revision 1.9
diff -u -p -r1.9 util.c
--- programs/winetest/util.c	18 Mar 2005 14:09:55 -0000	1.9
+++ programs/winetest/util.c	13 Apr 2005 11:14:11 -0000
@@ -104,15 +104,20 @@ void xprintf (const char *fmt, ...)
     free (buffer);
 }
 
+int
+goodtagchar (char c)
+{
+    return (('a'<=c && c<='z') ||
+            ('A'<=c && c<='Z') ||
+            ('0'<=c && c<='9') ||
+            c=='-' || c=='.');
+}
+
 const char *
-badtagchar (const char *tag)
+findbadtagchar (const char *tag)
 {
     while (*tag)
-        if (('a'<=*tag && *tag<='z') ||
-            ('A'<=*tag && *tag<='Z') ||
-            ('0'<=*tag && *tag<='9') ||
-            *tag=='-' || *tag=='.')
-            tag++;
+        if (goodtagchar (*tag)) tag++;
         else return tag;
     return NULL;
 }
Index: programs/winetest/winetest.h
===================================================================
RCS file: /home/wine/wine/programs/winetest/winetest.h,v
retrieving revision 1.7
diff -u -p -r1.7 winetest.h
--- programs/winetest/winetest.h	11 Apr 2005 16:10:01 -0000	1.7
+++ programs/winetest/winetest.h	13 Apr 2005 11:14:11 -0000
@@ -33,7 +33,8 @@ void *xrealloc (void *op, size_t len);
 void xprintf (const char *fmt, ...);
 char *vstrmake (size_t *lenp, va_list ap);
 char *strmake (size_t *lenp, ...);
-const char *badtagchar (const char *tag);
+int goodtagchar (char c);
+const char *findbadtagchar (const char *tag);
 
 int send_file (const char *name);
 
Index: programs/winetest/winetest.rc
===================================================================
RCS file: /home/wine/wine/programs/winetest/winetest.rc,v
retrieving revision 1.2
diff -u -p -r1.2 winetest.rc
--- programs/winetest/winetest.rc	31 Mar 2005 15:22:41 -0000	1.2
+++ programs/winetest/winetest.rc	13 Apr 2005 11:14:11 -0000
@@ -29,7 +29,7 @@ CAPTION "No tag supplied"
 BEGIN
     CTEXT "Please supply a tag for your report.  You can use letters, digits, dashes and periods."
         IDC_STATIC, 10, 5, 130, 30
-    EDITTEXT IDC_TAG, 35, 30, 80, 10
+    EDITTEXT IDC_TAG, 35, 30, 80, 10, ES_AUTOHSCROLL
     DEFPUSHBUTTON "Start", IDOK, 25, 45, 40, 14
     PUSHBUTTON    "Abort", IDABORT, 85, 45, 40, 14
 END



More information about the wine-patches mailing list