File indexing completed on 2025-05-11 08:24:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
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 }