You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Share the utf8 to wchar conversion routine between lavf and lavu
This doesn't add any dependency on library internals, since this only is a static inline function that gets built into each of the calling functions - this is only to reduce the code duplication. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
		| @@ -127,24 +127,7 @@ int ff_poll(struct pollfd *fds, nfds_t numfds, int timeout); | ||||
| #elif defined(_WIN32) | ||||
| #include <stdio.h> | ||||
| #include <windows.h> | ||||
| #include "libavutil/mem.h" | ||||
|  | ||||
| static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w) | ||||
| { | ||||
|     int num_chars; | ||||
|     num_chars = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename_utf8, -1, NULL, 0); | ||||
|     if (num_chars <= 0) { | ||||
|         *filename_w = NULL; | ||||
|         return 0; | ||||
|     } | ||||
|     *filename_w = av_mallocz(sizeof(wchar_t) * num_chars); | ||||
|     if (!*filename_w) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
|     MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars); | ||||
|     return 0; | ||||
| } | ||||
| #include "libavutil/wchar_filename.h" | ||||
|  | ||||
| #define DEF_FS_FUNCTION(name, wfunc, afunc)               \ | ||||
| static inline int win32_##name(const char *filename_utf8) \ | ||||
|   | ||||
| @@ -37,23 +37,18 @@ | ||||
| #include <windows.h> | ||||
| #include <share.h> | ||||
| #include <errno.h> | ||||
| #include "wchar_filename.h" | ||||
|  | ||||
| static int win32_open(const char *filename_utf8, int oflag, int pmode) | ||||
| { | ||||
|     int fd; | ||||
|     int num_chars; | ||||
|     wchar_t *filename_w; | ||||
|  | ||||
|     /* convert UTF-8 to wide chars */ | ||||
|     num_chars = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename_utf8, -1, NULL, 0); | ||||
|     if (num_chars <= 0) | ||||
|         goto fallback; | ||||
|     filename_w = av_mallocz(sizeof(wchar_t) * num_chars); | ||||
|     if (!filename_w) { | ||||
|         errno = ENOMEM; | ||||
|     if (utf8towchar(filename_utf8, &filename_w)) | ||||
|         return -1; | ||||
|     } | ||||
|     MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, filename_w, num_chars); | ||||
|     if (!filename_w) | ||||
|         goto fallback; | ||||
|  | ||||
|     fd = _wsopen(filename_w, oflag, SH_DENYNO, pmode); | ||||
|     av_freep(&filename_w); | ||||
|   | ||||
							
								
								
									
										44
									
								
								libavutil/wchar_filename.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								libavutil/wchar_filename.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| /* | ||||
|  * This file is part of Libav. | ||||
|  * | ||||
|  * Libav is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * Libav is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with Libav; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #ifndef AVUTIL_WCHAR_FILENAME_H | ||||
| #define AVUTIL_WCHAR_FILENAME_H | ||||
|  | ||||
| #if defined(_WIN32) && !defined(__MINGW32CE__) | ||||
| #include <windows.h> | ||||
| #include "mem.h" | ||||
|  | ||||
| static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w) | ||||
| { | ||||
|     int num_chars; | ||||
|     num_chars = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename_utf8, -1, NULL, 0); | ||||
|     if (num_chars <= 0) { | ||||
|         *filename_w = NULL; | ||||
|         return 0; | ||||
|     } | ||||
|     *filename_w = av_mallocz(sizeof(wchar_t) * num_chars); | ||||
|     if (!*filename_w) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
|     MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars); | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* AVUTIL_WCHAR_FILENAME_H */ | ||||
		Reference in New Issue
	
	Block a user