From 64fbfed781f2536c562576d040137ec75f89282a Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 21 Feb 2012 12:54:42 +0000 Subject: [PATCH] added qse_fs_delete() still primitive --- qse/cmd/sed/sed.c | 5 +- qse/include/qse/cmn/fs.h | 5 + qse/lib/cmn/fs-move.c | 168 +++++++++++++++++++++++- qse/lib/cmn/fs.h | 2 + qse/lib/cmn/pio.c | 2 +- qse/watcom/debug/os2/cmd/sed/qsesed.tgt | 57 ++++---- qse/watcom/qse.wpj | 28 ++-- 7 files changed, 220 insertions(+), 47 deletions(-) diff --git a/qse/cmd/sed/sed.c b/qse/cmd/sed/sed.c index dc3e607a..67772a47 100644 --- a/qse/cmd/sed/sed.c +++ b/qse/cmd/sed/sed.c @@ -724,10 +724,7 @@ int sed_main (int argc, qse_char_t* argv[]) if (tmpl_tmpfile) { -/* -TODO: - qse_fs_remove (fs, tmpl_tmpfile); -*/ + qse_fs_delete (fs, tmpl_tmpfile); QSE_MMGR_FREE (qse_sed_getmmgr(sed), tmpl_tmpfile); } print_exec_error (sed); diff --git a/qse/include/qse/cmn/fs.h b/qse/include/qse/cmn/fs.h index 0c969a0e..4ac66479 100644 --- a/qse/include/qse/cmn/fs.h +++ b/qse/include/qse/cmn/fs.h @@ -164,6 +164,11 @@ int qse_fs_move ( const qse_char_t* newpath ); +int qse_fs_delete ( + qse_fs_t* fs, + const qse_char_t* path +); + #ifdef __cplusplus } #endif diff --git a/qse/lib/cmn/fs-move.c b/qse/lib/cmn/fs-move.c index 01b5d00f..e30a7be9 100644 --- a/qse/lib/cmn/fs-move.c +++ b/qse/lib/cmn/fs-move.c @@ -43,7 +43,6 @@ struct fop_t { int flags; - #if defined(_WIN32) /* nothing yet */ #elif defined(__OS2__) @@ -255,7 +254,7 @@ int qse_fs_move ( { /* both source and destination are the same. * this operation is not allowed */ - fs->errnum = QSE_FS_EPERM; + fs->errnum = QSE_FS_EACCES; goto oops; } @@ -281,7 +280,6 @@ int qse_fs_move ( fs->errnum = QSE_FS_ENOMEM; goto oops; } -qse_printf (QSE_T("new_path2 => [%hs]\n"), fop.new_path2); } else { @@ -314,7 +312,7 @@ qse_printf (QSE_T("new_path2 => [%hs]\n"), fop.new_path2); if (!S_ISDIR(fop.old_stat.st_mode)) { /* copy a single file */ -qse_printf (QSE_T("TODO: cross-device copy....\n")); + /* ............ */ } #if 0 @@ -351,3 +349,165 @@ oops: #endif } + +typedef struct del_op_t del_op_t; +struct del_op_t +{ +#if defined(_WIN32) + /* nothing */ +#elif defined(__OS2__) + qse_mchar_t* path; +#elif defined(__DOS__) + qse_mchar_t* path; +#else + qse_mchar_t* path; +#endif +}; + +int qse_fs_delete (qse_fs_t* fs, const qse_char_t* path) +{ + /* TODO: improve this function to support fs->curdir ... etc + * delete directory ... etc */ + +#if defined(_WIN32) + + if (DeleteFile (path) == FALSE) + { + fs->errnum = qse_fs_syserrtoerrnum (fs, GetLastError()); + return -1; + } + + return 0; + + +#elif defined(__OS2__) + + /* ------------------------------------------------------ */ + + APIRET rc; + del_op_t dop; + + + QSE_MEMSET (&dop, 0, QSE_SIZEOF(dop)); + + #if defined(QSE_CHAR_IS_MCHAR) + dop.path = path; + #else + dop.path = qse_wcstombsdup (path, fs->mmgr); + if (dop.path == QSE_NULL) + { + fs->errnum = QSE_FS_ENOMEM; + goto oops; + } + #endif + + rc = DosDelete (dop.path); + if (rc != NO_ERROR) + { + fs->errnum = qse_fs_syserrtoerrnum (fs, rc); + goto oops; + } + + #if defined(QSE_CHAR_IS_MCHAR) + /* nothing to do */ + #else + QSE_MMGR_FREE (fs->mmgr, dop.path); + #endif + return 0; + + /* ------------------------------------------------------ */ + +oops: + #if defined(QSE_CHAR_IS_MCHAR) + /* nothing to do */ + #else + if (dop.path) QSE_MMGR_FREE (fs->mmgr, dop.path); + #endif + return -1; + +#elif defined(__DOS__) + + /* ------------------------------------------------------ */ + + del_op_t dop; + + QSE_MEMSET (&dop, 0, QSE_SIZEOF(dop)); + + #if defined(QSE_CHAR_IS_MCHAR) + dop.path = path; + #else + dop.path = qse_wcstombsdup (path, fs->mmgr); + if (dop.path == QSE_NULL) + { + fs->errnum = QSE_FS_ENOMEM; + goto oops; + } + #endif + + if (unlink (dop.path) <= -1) + { + fs->errnum = qse_fs_syserrtoerrnum (fs, errno); + goto oops; + } + + #if defined(QSE_CHAR_IS_MCHAR) + /* nothing to do */ + #else + QSE_MMGR_FREE (fs->mmgr, dop.path); + #endif + return 0; + +oops: + #if defined(QSE_CHAR_IS_MCHAR) + /* nothing to do */ + #else + if (dop.path) QSE_MMGR_FREE (fs->mmgr, dop.path); + #endif + return -1; + + /* ------------------------------------------------------ */ + +#else + + /* ------------------------------------------------------ */ + + del_op_t dop; + + QSE_MEMSET (&dop, 0, QSE_SIZEOF(dop)); + + #if defined(QSE_CHAR_IS_MCHAR) + dop.path = path; + #else + dop.path = qse_wcstombsdup (path, fs->mmgr); + if (dop.path == QSE_NULL) + { + fs->errnum = QSE_FS_ENOMEM; + goto oops; + } + #endif + + if (QSE_UNLINK (dop.path) <= -1) + { + fs->errnum = qse_fs_syserrtoerrnum (fs, errno); + goto oops; + } + + #if defined(QSE_CHAR_IS_MCHAR) + /* nothing to do */ + #else + QSE_MMGR_FREE (fs->mmgr, dop.path); + #endif + return 0; + +oops: + #if defined(QSE_CHAR_IS_MCHAR) + /* nothing to do */ + #else + if (dop.path) QSE_MMGR_FREE (fs->mmgr, dop.path); + #endif + return -1; + + /* ------------------------------------------------------ */ + +#endif +} diff --git a/qse/lib/cmn/fs.h b/qse/lib/cmn/fs.h index b76b8eb3..7c01bf8d 100644 --- a/qse/lib/cmn/fs.h +++ b/qse/lib/cmn/fs.h @@ -29,6 +29,8 @@ typedef APIRET qse_fs_syserr_t; #elif defined(__DOS__) # include +# include +# include /* for rename() */ typedef int qse_fs_syserr_t; #else # include "syscall.h" diff --git a/qse/lib/cmn/pio.c b/qse/lib/cmn/pio.c index e265ca38..d27eadf0 100644 --- a/qse/lib/cmn/pio.c +++ b/qse/lib/cmn/pio.c @@ -1232,7 +1232,7 @@ create_process: pio->errnum = syserr_to_errnum (pserr); goto oops; } - if ((pserr = posix_spawn_file_actions_adddup2 (&fa, handle[0]), 0) != 0) + if ((pserr = posix_spawn_file_actions_adddup2 (&fa, handle[0], 0)) != 0) { pio->errnum = syserr_to_errnum (pserr); goto oops; diff --git a/qse/watcom/debug/os2/cmd/sed/qsesed.tgt b/qse/watcom/debug/os2/cmd/sed/qsesed.tgt index d2d35166..472863e8 100755 --- a/qse/watcom/debug/os2/cmd/sed/qsesed.tgt +++ b/qse/watcom/debug/os2/cmd/sed/qsesed.tgt @@ -67,103 +67,112 @@ qsecmn qsesed 0 17 WVList +1 +18 +ActionStates +19 +WString +12 +Local &Debug +20 +WVList 0 -1 1 1 0 -18 +21 WPickList 2 -19 +22 MItem 3 *.c -20 +23 WString 4 COBJ -21 +24 WVList 3 -22 +25 MVState -23 +26 WString 3 WCC -24 +27 WString 25 o?2??Include directories: 1 -25 +28 WString 54 "$(%watcom)/h;$(%watcom)/h/os2;../../../../../include" 0 -26 +29 MVState -27 +30 WString 3 WCC -28 +31 WString 23 ?????Macro definitions: 1 -29 +32 WString 15 QSE_BUILD_DEBUG 0 -30 +33 MCState -31 +34 WString 3 WCC -32 +35 WString 29 ?????Emit Browser information 1 1 -33 +36 WVList 0 -1 1 1 0 -34 +37 MItem 28 ../../../../../cmd/sed/sed.c -35 +38 WString 4 COBJ -36 +39 WVList 1 -37 +40 MCState -38 +41 WString 3 WCC -39 +42 WString 29 ?????Emit Browser information 1 1 -40 +43 WVList 0 -19 +22 1 1 0 diff --git a/qse/watcom/qse.wpj b/qse/watcom/qse.wpj index f51533ce..1df595bf 100755 --- a/qse/watcom/qse.wpj +++ b/qse/watcom/qse.wpj @@ -5,7 +5,7 @@ VpeMain 1 WRect 390 -40 +26 9320 9680 2 @@ -154,8 +154,8 @@ WRect WFileName 28 debug/os2/lib/cmn/qsecmn.tgt -8 -12 +0 +4 36 VComponent 37 @@ -164,14 +164,14 @@ WRect 2360 5700 4240 -1 +0 0 38 WFileName 28 debug/os2/lib/sed/qsesed.tgt 0 -0 +3 39 VComponent 40 @@ -224,8 +224,8 @@ debug/win32/lib/awk/qseawk.tgt VComponent 49 WRect -2480 -360 +330 +413 5700 4240 1 @@ -240,8 +240,8 @@ debug/os2/cmd/awk/qseawk.tgt VComponent 52 WRect -1730 -1080 +2430 +920 5700 4240 0 @@ -251,7 +251,7 @@ WFileName 30 debug/dos32/lib/cmn/qsecmn.tgt 0 -3 +0 54 VComponent 55 @@ -308,14 +308,14 @@ WRect 0 5700 4240 -1 +0 0 65 WFileName 30 debug/dos32/lib/sed/qsesed.tgt 0 -0 +5 66 VComponent 67 @@ -324,7 +324,7 @@ WRect 560 5700 4240 -1 +0 0 68 WFileName @@ -340,7 +340,7 @@ WRect 0 5700 4240 -1 +0 0 71 WFileName