Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:16

0001 /**
0002  * @file
0003  *
0004  * @ingroup DOSFS
0005  *
0006  * @brief Default Converter
0007  */
0008 
0009 /*
0010  * Copyright (c) 2013 embedded brains GmbH & Co. KG
0011  *
0012  * The license and distribution terms for this file may be
0013  * found in the file LICENSE in this distribution or at
0014  * http://www.rtems.org/license/LICENSE.
0015  */
0016 
0017 #include <stdlib.h>
0018 #include <string.h>
0019 #include <errno.h>
0020 #include <ctype.h>
0021 #include <assert.h>
0022 #include <rtems/endian.h>
0023 #include <rtems/dosfs.h>
0024 #include "fat.h"
0025 #include "msdos.h"
0026 
0027 static int msdos_default_utf8_to_codepage(
0028   rtems_dosfs_convert_control *super,
0029   const uint8_t               *src,
0030   const size_t                 src_size,
0031   char                        *dst,
0032   size_t                      *dst_size
0033 )
0034 {
0035   int    eno = 0;
0036   size_t bytes_to_copy = MIN( src_size, *dst_size );
0037 
0038   (void) super;
0039 
0040   *dst_size = bytes_to_copy;
0041 
0042   memcpy( dst, src, bytes_to_copy );
0043 
0044   return eno;
0045 }
0046 
0047 static int msdos_default_codepage_to_utf8(
0048   rtems_dosfs_convert_control *super,
0049   const char                  *src,
0050   const size_t                 src_size,
0051   uint8_t                     *dst,
0052   size_t                      *dst_size
0053 )
0054 {
0055   int    eno = 0;
0056   size_t bytes_to_copy = MIN( src_size, *dst_size );
0057 
0058   (void) super;
0059 
0060   *dst_size = bytes_to_copy;
0061 
0062   memcpy( dst, src, bytes_to_copy );
0063 
0064   return eno;
0065 }
0066 
0067 static int msdos_default_utf8_to_utf16(
0068   rtems_dosfs_convert_control *super,
0069   const uint8_t               *src,
0070   const size_t                 src_size,
0071   uint16_t                    *dst,
0072   size_t                      *dst_size
0073 )
0074 {
0075   int    eno = 0;
0076   size_t bytes_to_copy = MIN( src_size, *dst_size / 2);
0077   size_t i;
0078 
0079   (void) super;
0080 
0081   *dst_size = 2 * bytes_to_copy;
0082 
0083   for ( i = 0; eno == 0 && i < bytes_to_copy; ++i ) {
0084     uint16_t utf16_native = src[i];
0085 
0086     if ( utf16_native <= 127 ) {
0087       dst[i] = CT_LE_W( utf16_native );
0088     } else {
0089       eno = EINVAL;
0090     }
0091   }
0092 
0093   return eno;
0094 }
0095 
0096 static int msdos_default_utf16_to_utf8(
0097   rtems_dosfs_convert_control *super,
0098   const uint16_t              *src,
0099   const size_t                 src_size,
0100   uint8_t                     *dst,
0101   size_t                      *dst_size
0102 )
0103 {
0104   int    eno = 0;
0105   size_t bytes_to_copy = MIN( src_size / 2, *dst_size );
0106   size_t i;
0107 
0108   (void) super;
0109 
0110   *dst_size = bytes_to_copy;
0111 
0112   for ( i = 0; eno == 0 && i < bytes_to_copy; ++i ) {
0113     uint16_t utf16_le = src[i];
0114     uint16_t utf16_native  = CF_LE_W( utf16_le );
0115 
0116     if ( utf16_native <= 127 ) {
0117       dst[i] = (uint8_t) utf16_native;
0118     } else {
0119       eno = EINVAL;
0120     }
0121   }
0122 
0123   return eno;
0124 }
0125 
0126 static int msdos_default_normalize_and_fold(
0127   rtems_dosfs_convert_control *super,
0128   const uint8_t               *src,
0129   const size_t                 src_size,
0130   uint8_t                     *dst,
0131   size_t                      *dst_size
0132 )
0133 {
0134   int    eno = 0;
0135   size_t bytes_to_copy = MIN( src_size, *dst_size );
0136   size_t i;
0137 
0138   (void) super;
0139 
0140   *dst_size = bytes_to_copy;
0141 
0142   for ( i = 0; i < bytes_to_copy; ++i ) {
0143     dst[i] = tolower( src[i] );
0144   }
0145 
0146   return eno;
0147 }
0148 
0149 static void msdos_default_destroy(
0150   rtems_dosfs_convert_control *super
0151 )
0152 {
0153   free( super );
0154 }
0155 
0156 static const rtems_dosfs_convert_handler msdos_default_convert_handler = {
0157   .utf8_to_codepage = msdos_default_utf8_to_codepage,
0158   .codepage_to_utf8 = msdos_default_codepage_to_utf8,
0159   .utf8_to_utf16 = msdos_default_utf8_to_utf16,
0160   .utf16_to_utf8 = msdos_default_utf16_to_utf8,
0161   .utf8_normalize_and_fold = msdos_default_normalize_and_fold,
0162   .destroy = msdos_default_destroy
0163 };
0164 
0165 typedef struct {
0166   rtems_dosfs_convert_control super;
0167   uint8_t buffer[MSDOS_NAME_MAX_LFN_BYTES];
0168 } msdos_default_convert_control;
0169 
0170 rtems_dosfs_convert_control *rtems_dosfs_create_default_converter(void)
0171 {
0172   msdos_default_convert_control *self = malloc( sizeof( *self ) );
0173 
0174   if ( self != NULL ) {
0175     rtems_dosfs_convert_control *super = &self->super;
0176 
0177     super->handler = &msdos_default_convert_handler;
0178     super->buffer.data = &self->buffer;
0179     super->buffer.size = sizeof( self->buffer );
0180   }
0181 
0182   return &self->super;
0183 }