[PATCH 1/9] dosfs: UTF-8 Support: UI, backwards compatibility
Gedare Bloom
gedare at rtems.org
Fri May 31 14:47:26 UTC 2013
On Fri, May 31, 2013 at 9:42 AM, Ralf Kirchner
<ralf.kirchner at embedded-brains.de> wrote:
> User interface and backwards compatibility for UTF-8 support in the FAT
> file system. Purpose of UTF-8 support is to permit file names and
> directory names with characters from all kinds of languages (Czech,
> Chinese, Arabian, Hebrew, Korean, ...). This commit does not yet
> support multibyte characters. It only contains the user interface and
> the backwards compatibility.
> ---
> cpukit/libfs/Makefile.am | 1 +
> cpukit/libfs/src/dosfs/dosfs.h | 197 ++++-
> cpukit/libfs/src/dosfs/msdos.h | 70 +-
> cpukit/libfs/src/dosfs/msdos_conv.c | 619 ++++++++++++----
> cpukit/libfs/src/dosfs/msdos_conv_default.c | 188 +++++
> cpukit/libfs/src/dosfs/msdos_create.c | 3 +-
> cpukit/libfs/src/dosfs/msdos_dir.c | 191 ++---
> cpukit/libfs/src/dosfs/msdos_fsunmount.c | 4 +-
> cpukit/libfs/src/dosfs/msdos_init.c | 35 +-
> cpukit/libfs/src/dosfs/msdos_initsupp.c | 5 +-
> cpukit/libfs/src/dosfs/msdos_misc.c | 1028 +++++++++++++++++++--------
> 11 Dateien geändert, 1781 Zeilen hinzugefügt(+), 560 Zeilen entfernt(-)
> create mode 100644 cpukit/libfs/src/dosfs/msdos_conv_default.c
>
> diff --git a/cpukit/libfs/Makefile.am b/cpukit/libfs/Makefile.am
> index 0828da8..e06c8bd 100644
> --- a/cpukit/libfs/Makefile.am
> +++ b/cpukit/libfs/Makefile.am
> @@ -81,6 +81,7 @@ libdosfs_a_SOURCES += src/dosfs/msdos_create.c src/dosfs/msdos_dir.c \
> src/dosfs/msdos_initsupp.c src/dosfs/msdos_misc.c \
> src/dosfs/msdos_mknod.c src/dosfs/msdos_node_type.c \
> src/dosfs/msdos_rmnod.c src/dosfs/msdos_statvfs.c \
> + src/dosfs/msdos_conv_default.c \
> src/dosfs/msdos_conv.c src/dosfs/msdos.h src/dosfs/msdos_format.c \
> src/dosfs/dosfs.h src/dosfs/msdos_rename.c
> endif
> diff --git a/cpukit/libfs/src/dosfs/dosfs.h b/cpukit/libfs/src/dosfs/dosfs.h
> index ea650b2..c7b27df 100644
> --- a/cpukit/libfs/src/dosfs/dosfs.h
> +++ b/cpukit/libfs/src/dosfs/dosfs.h
> @@ -1,15 +1,18 @@
> /**
> - * @file rtems/dosfs.h
> + * @file
> *
> - * @brief Application Interface to MSDOS Filesystem
> + * @brief Application Interface to FAT Filesystem
> *
> - * @ingroup rtems_msdos_format
> + * @ingroup DOSFS
> */
>
> /*
> * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
> * Author: Eugeny S. Mints <Eugeny.Mints at oktet.ru>
> *
> + * Modifications to support UTF-8 in the file system are
> + * Copyright (c) 2013 embedded brains GmbH.
> + *
> * The license and distribution terms for this file may be
> * found in the file LICENSE in this distribution or at
> * http://www.rtems.com/license/LICENSE.
> @@ -25,6 +28,170 @@
> extern "C" {
> #endif
>
> +typedef struct rtems_dosfs_convert_control rtems_dosfs_convert_control;
> +
I think it is usual to put the struct definition before the function
prototypes in header files. I don't know if we have any rule about it
though.
> @@ -131,6 +309,9 @@ int msdos_format (
>
> /** @} */
>
> +int rtems_dosfs_initialize(rtems_filesystem_mount_table_entry_t *mt_entry,
> + const void *data);
> +
Can you give doxygen for this function now too? I know it did not have
it, but it might be helpful.
> diff --git a/cpukit/libfs/src/dosfs/msdos.h b/cpukit/libfs/src/dosfs/msdos.h
> index 78eda9b..6da47cc 100644
> --- a/cpukit/libfs/src/dosfs/msdos.h
> +++ b/cpukit/libfs/src/dosfs/msdos.h
> @@ -10,6 +10,9 @@
> * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
> * Author: Eugeny S. Mints <Eugeny.Mints at oktet.ru>
> *
> + * Modifications to support UTF-8 in the file system are
> + * Copyright (c) 2013 embedded brains GmbH.
> + *
> * The license and distribution terms for this file may be
> * found in the file LICENSE in this distribution or at
> * http://www.rtems.com/license/LICENSE.
> @@ -20,6 +23,7 @@
>
> #include <rtems.h>
> #include <rtems/libio_.h>
> +#include <rtems/dosfs.h>
>
> #include "fat.h"
> #include "fat_file.h"
> @@ -67,6 +71,8 @@ typedef struct msdos_fs_info_s
> * just placeholder
> * for anything
> */
> +
> + rtems_dosfs_convert_control *converter;
> } msdos_fs_info_t;
>
Please add a comment about the converter field.
> @@ -309,7 +328,8 @@ int msdos_initialize_support(
> rtems_filesystem_mount_table_entry_t *temp_mt_entry,
> const rtems_filesystem_operations_table *op_table,
> const rtems_filesystem_file_handlers_r *file_handlers,
> - const rtems_filesystem_file_handlers_r *directory_handlers
> + const rtems_filesystem_file_handlers_r *directory_handlers,
> + rtems_dosfs_convert_control *converter
> );
>
> int msdos_file_close(rtems_libio_t *iop /* IN */);
> @@ -387,10 +407,52 @@ int msdos_get_name_node(
>
> int msdos_dir_info_remove(rtems_filesystem_location_info_t *pathloc);
>
> -msdos_name_type_t msdos_long_to_short(const char *lfn, int lfn_len,
> +ssize_t
> +msdos_format_dirent_with_dot(char *dst,const char *src);
> +
> +msdos_name_type_t msdos_long_to_short(rtems_dosfs_convert_control *converter,
> + const char *lfn, int lfn_len,
> char* sfn, int sfn_len);
>
> -int msdos_filename_unix2dos(const char *un, int unlen, char *dn);
> +ssize_t
> +msdos_filename_utf8_to_short_name_for_compare (
> + rtems_dosfs_convert_control *converter,
> + const uint8_t *utf8_name,
> + const size_t utf8_name_size,
> + void *short_name,
> + const size_t short_name_size);
> +
> +ssize_t
> +msdos_filename_utf8_to_short_name_for_save (
> + rtems_dosfs_convert_control *converter,
> + const uint8_t *utf8_name,
> + const size_t utf8_name_size,
> + void *short_name,
> + const size_t short_name_size);
> +
> +ssize_t
> +msdos_filename_utf8_to_long_name_for_compare (
> + rtems_dosfs_convert_control *converter,
> + const uint8_t *utf8_name,
> + const size_t utf8_name_size,
> + uint8_t *long_name,
> + const size_t long_name_size);
> +
> +ssize_t
> +msdos_filename_utf8_to_long_name_for_save (
> + rtems_dosfs_convert_control *converter,
> + const uint8_t *utf8_name,
> + const size_t utf8_name_size,
> + uint16_t *long_name,
> + const size_t long_name_size);
> +
> +ssize_t
> +msdos_get_utf16_string_from_long_entry (
> + const char *entry,
> + uint16_t *entry_string_buf,
> + const size_t buf_size,
> + bool is_first_entry
> +);
>
Why no doxygen comments for these new functions?
> void msdos_date_unix2dos(
> unsigned int tsp, uint16_t *ddp,
> @@ -430,7 +492,7 @@ int msdos_find_name_in_fat_file(
> rtems_filesystem_mount_table_entry_t *mt_entry,
> fat_file_fd_t *fat_fd,
> bool create_node,
> - const char *name,
> + const uint8_t *name_utf8,
> int name_len,
> msdos_name_type_t name_type,
> fat_dir_pos_t *dir_pos,
> diff --git a/cpukit/libfs/src/dosfs/msdos_conv.c b/cpukit/libfs/src/dosfs/msdos_conv.c
> index 7549c42..7e688ef 100644
> --- a/cpukit/libfs/src/dosfs/msdos_conv.c
> +++ b/cpukit/libfs/src/dosfs/msdos_conv.c
> @@ -22,18 +22,38 @@
> * $NetBSD: msdosfs_conv.c,v 1.10 1994/12/27 18:36:24 mycroft Exp $
> *
> * October 1992
> + *
> + * Modifications to support UTF-8 in the file system are
> + * Copyright (c) 2013 embedded brains GmbH.
> */
>
> #if HAVE_CONFIG_H
> #include "config.h"
> #endif
>
> +#include <ctype.h>
> #include <rtems.h>
> #include "msdos.h"
>
> /* #define SECONDSPERDAY (24 * 60 * 60) */
> #define SECONDSPERDAY ((uint32_t) 86400)
Does this generate equivalent code as (86400U)? Just curious mostly.
I skimmed the rest. It is a lot of code!
-Gedare
More information about the devel
mailing list