root/fs/ntfs/collate.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ntfs_collate_binary
  2. ntfs_collate_ntofs_ulong
  3. ntfs_collate

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * collate.c - NTFS kernel collation handling.  Part of the Linux-NTFS project.
   4  *
   5  * Copyright (c) 2004 Anton Altaparmakov
   6  */
   7 
   8 #include "collate.h"
   9 #include "debug.h"
  10 #include "ntfs.h"
  11 
  12 static int ntfs_collate_binary(ntfs_volume *vol,
  13                 const void *data1, const int data1_len,
  14                 const void *data2, const int data2_len)
  15 {
  16         int rc;
  17 
  18         ntfs_debug("Entering.");
  19         rc = memcmp(data1, data2, min(data1_len, data2_len));
  20         if (!rc && (data1_len != data2_len)) {
  21                 if (data1_len < data2_len)
  22                         rc = -1;
  23                 else
  24                         rc = 1;
  25         }
  26         ntfs_debug("Done, returning %i", rc);
  27         return rc;
  28 }
  29 
  30 static int ntfs_collate_ntofs_ulong(ntfs_volume *vol,
  31                 const void *data1, const int data1_len,
  32                 const void *data2, const int data2_len)
  33 {
  34         int rc;
  35         u32 d1, d2;
  36 
  37         ntfs_debug("Entering.");
  38         // FIXME:  We don't really want to bug here.
  39         BUG_ON(data1_len != data2_len);
  40         BUG_ON(data1_len != 4);
  41         d1 = le32_to_cpup(data1);
  42         d2 = le32_to_cpup(data2);
  43         if (d1 < d2)
  44                 rc = -1;
  45         else {
  46                 if (d1 == d2)
  47                         rc = 0;
  48                 else
  49                         rc = 1;
  50         }
  51         ntfs_debug("Done, returning %i", rc);
  52         return rc;
  53 }
  54 
  55 typedef int (*ntfs_collate_func_t)(ntfs_volume *, const void *, const int,
  56                 const void *, const int);
  57 
  58 static ntfs_collate_func_t ntfs_do_collate0x0[3] = {
  59         ntfs_collate_binary,
  60         NULL/*ntfs_collate_file_name*/,
  61         NULL/*ntfs_collate_unicode_string*/,
  62 };
  63 
  64 static ntfs_collate_func_t ntfs_do_collate0x1[4] = {
  65         ntfs_collate_ntofs_ulong,
  66         NULL/*ntfs_collate_ntofs_sid*/,
  67         NULL/*ntfs_collate_ntofs_security_hash*/,
  68         NULL/*ntfs_collate_ntofs_ulongs*/,
  69 };
  70 
  71 /**
  72  * ntfs_collate - collate two data items using a specified collation rule
  73  * @vol:        ntfs volume to which the data items belong
  74  * @cr:         collation rule to use when comparing the items
  75  * @data1:      first data item to collate
  76  * @data1_len:  length in bytes of @data1
  77  * @data2:      second data item to collate
  78  * @data2_len:  length in bytes of @data2
  79  *
  80  * Collate the two data items @data1 and @data2 using the collation rule @cr
  81  * and return -1, 0, ir 1 if @data1 is found, respectively, to collate before,
  82  * to match, or to collate after @data2.
  83  *
  84  * For speed we use the collation rule @cr as an index into two tables of
  85  * function pointers to call the appropriate collation function.
  86  */
  87 int ntfs_collate(ntfs_volume *vol, COLLATION_RULE cr,
  88                 const void *data1, const int data1_len,
  89                 const void *data2, const int data2_len) {
  90         int i;
  91 
  92         ntfs_debug("Entering.");
  93         /*
  94          * FIXME:  At the moment we only support COLLATION_BINARY and
  95          * COLLATION_NTOFS_ULONG, so we BUG() for everything else for now.
  96          */
  97         BUG_ON(cr != COLLATION_BINARY && cr != COLLATION_NTOFS_ULONG);
  98         i = le32_to_cpu(cr);
  99         BUG_ON(i < 0);
 100         if (i <= 0x02)
 101                 return ntfs_do_collate0x0[i](vol, data1, data1_len,
 102                                 data2, data2_len);
 103         BUG_ON(i < 0x10);
 104         i -= 0x10;
 105         if (likely(i <= 3))
 106                 return ntfs_do_collate0x1[i](vol, data1, data1_len,
 107                                 data2, data2_len);
 108         BUG();
 109         return 0;
 110 }

/* [<][>][^][v][top][bottom][index][help] */