[ros-diffs] [pschweitzer] 35474: First implementation of FsRtlIsDbcsInExpression. It will probably need more work. Now, all the Dbcs functions are implemented.

pschweitzer at svn.reactos.org pschweitzer at svn.reactos.org
Wed Aug 20 12:06:06 CEST 2008


Author: pschweitzer
Date: Wed Aug 20 05:06:06 2008
New Revision: 35474

URL: http://svn.reactos.org/svn/reactos?rev=35474&view=rev
Log:
First implementation of FsRtlIsDbcsInExpression. It will probably need more work.
Now, all the Dbcs functions are implemented.

Modified:
    branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c

Modified: branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c
URL: http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c?rev=35474&r1=35473&r2=35474&view=diff
==============================================================================
--- branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] Wed Aug 20 05:06:06 2008
@@ -138,17 +138,17 @@
 
 /*++
  * @name FsRtlIsDbcsInExpression
- * @unimplemented
- *
- * FILLME
+ * @implemented
+ *
+ * Check if the Name string is in the Expression string.
  *
  * @param Expression
- *        FILLME
+ *        The string in which we've to find Name. It can contains wildcards
  *
  * @param Name
- *        FILLME
- *
- * @return None
+ *        The string to find. It cannot contain wildcards.
+ *
+ * @return TRUE if Name is found in Expression, FALSE otherwise
  *
  * @remarks None
  *
@@ -158,7 +158,50 @@
 FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
                         IN PANSI_STRING Name)
 {
-    KEBUGCHECK(0);
+    ULONG ExpressionPosition, NamePosition, MatchingChars = 0;
+
+    ASSERT(!FsRtlDoesDbcsContainWildCards(Name));
+
+    /* One can't be null, both can be */
+    if (!Expression->Length || !Name->Length)
+    {
+        return !(Expression->Length ^ Name->Length);
+    }
+
+    for (ExpressionPosition = 0; ExpressionPosition < Expression->Length / sizeof(CHAR); ExpressionPosition++)
+    {
+        if ((Expression->Buffer[ExpressionPosition] == Name->Buffer[MatchingChars]) ||
+            (Expression->Buffer[ExpressionPosition] == '?') ||
+            (Expression->Buffer[ExpressionPosition] == ANSI_DOS_QM) ||
+            (Expression->Buffer[ExpressionPosition] == ANSI_DOS_DOT &&
+            (Name->Buffer[MatchingChars] == '.' || Name->Buffer[MatchingChars] == '0')))
+        {
+            MatchingChars++;
+        }
+        else if (Expression->Buffer[ExpressionPosition] == '*')
+        {
+            MatchingChars = Name->Length / sizeof(CHAR);
+        }
+        else if (Expression->Buffer[ExpressionPosition] == ANSI_DOS_STAR)
+        {
+            for (NamePosition = MatchingChars; NamePosition < Name->Length / sizeof(CHAR); NamePosition++)
+            {
+                if (Name->Buffer[NamePosition] == '.')
+                {
+                    MatchingChars = NamePosition;
+                }
+            }
+        }
+        else
+        {
+            MatchingChars = 0;
+        }
+        if (MatchingChars == Name->Length / sizeof(CHAR))
+        {
+            return TRUE;
+        }
+    }
+
     return FALSE;
 }
 



More information about the Ros-diffs mailing list