Files
open-simh.simtools/extracters/ods2/renamecmd.c
Timothe Litt 66e00b9900 Backlog of work since 2016
Too much to list all, but includes (in no particular order):
 - Cleanup for 64-bit builds, MSVC warnings.
 - Structured help
 - Help file compiler.
 - Supports volsets, writes/create work.
 - Support for I18n in messages, help.
 - Makefiles.
 - Initialize volume/volset
 - Command line editing/history

Builds and works on Linux and Windows (VS).
Not recently built or tested on other platforms, but
not intentinonally broken.
2022-10-10 11:00:20 -04:00

215 lines
6.7 KiB
C

/* This is part of ODS2, originally written by Paul Nankervis,
* email address: Paulnank@au1.ibm.com
* ODS2 is distributed freely for all members of the
* VMS community to use. However all derived works
* must maintain comments in their source to acknowledge
* the contributions of the original author and
* subsequent contributors. This is free software; no
* warranty is offered, and while we believe it to be useful,
* you use it at your own risk.
*/
#if !defined( DEBUG ) && defined( DEBUG_RENAMECMD )
#define DEBUG DEBUG_RENAMECMD
#else
#ifndef DEBUG
#define DEBUG 0
#endif
#endif
#include "cmddef.h"
/******************************************************************* dorename() */
/* rename a file */
#define rename_log OPT_GENERIC_1
#define rename_confirm OPT_GENERIC_2
qual_t
renamequals[] = { {"log", rename_log, 0, NV,
"-commands rename qual_log"},
{"nolog", 0, rename_log, NV, NULL},
{"confirm", rename_confirm, 0, NV,
"-commands rename qual_confirm"},
{"noconfirm", 0, rename_confirm, NV, NULL},
{NULL, 0, 0, NV, NULL}
};
param_t
renamepars[] = { {"from_filespec", REQ, FSPEC, NOPA,
"commands rename fromspec"},
{"to_filespec", REQ, FSPEC, NOPA,
"commands rename tospec"},
{ NULL, 0, 0, NOPA, NULL }
};
DECL_CMD(rename) {
options_t options;
vmscond_t sts = 0;
vmscond_t confirm = ODS2_CONFIRM_ALL;
uint32_t renamecnt = 0;
struct FAB ofab, nfab;
struct NAM onam, nnam;
char oes[NAM$C_MAXRSS+1], nes[NAM$C_MAXRSS+1],
ors[NAM$C_MAXRSS+1], nrs[NAM$C_MAXRSS+1];
UNUSED(argc);
if( $FAILS(sts = checkquals( &options, 0, renamequals, qualc, qualv )) ) {
return sts;
}
if( options & rename_confirm )
confirm = RENAME_CONFIRM;
/* Old spec, possibly wild */
onam = cc$rms_nam;
onam.nam$l_esa = oes;
onam.nam$b_ess = sizeof( oes ) -1;
onam.nam$l_rsa = ors;
onam.nam$b_rss = sizeof( ors ) -1;
ofab = cc$rms_fab;
ofab.fab$l_nam = &onam;
ofab.fab$l_fna = argv[1];
ofab.fab$b_fns = (uint8_t)strlen(ofab.fab$l_fna);
do {
if( $FAILS(sts = sys_parse(&ofab)) ) {
printmsg( RENAME_PARSEFAIL, 0, ofab.fab$l_fna );
sts = printmsg( sts, MSG_CONTINUE, RENAME_PARSEFAIL );
break;
}
oes[onam.nam$b_esl] = '\0';
while( $SUCCESSFUL(sts) ) {
struct FAB rfab;
struct NAM rnam;
char res[NAM$C_MAXRSS+1], rrs[NAM$C_MAXRSS+1];
if( $FAILS(sts = sys_search( &ofab )) ) {
if( $MATCHCOND(sts, RMS$_NMF) ) {
sts = SS$_NORMAL;
break;
}
printmsg( RENAME_SEARCHFAIL, 0, onam.nam$l_esa );
sts = printmsg( sts, MSG_CONTINUE, RENAME_SEARCHFAIL );
break;
}
ors[onam.nam$b_rsl] = '\0';
/* New spec */
nnam = cc$rms_nam;
nnam.nam$l_esa = nes;
nnam.nam$b_ess = sizeof( nes ) -1;
nnam.nam$l_rsa = nrs;
nnam.nam$b_rss = sizeof( nrs ) -1;
nnam.nam$l_rlf = &onam;
nfab = cc$rms_fab;
nfab.fab$l_nam = &nnam;
nfab.fab$l_fna = argv[2];
nfab.fab$b_fns = (uint8_t)strlen(nfab.fab$l_fna);
nfab.fab$l_fop = FAB$M_OFP;
if( $FAILS(sts = sys_parse(&nfab)) ) {
printmsg( RENAME_PARSEFAIL, 0, nfab.fab$l_fna );
sts = printmsg( sts, MSG_CONTINUE, RENAME_PARSEFAIL );
break;
}
nes[nnam.nam$b_esl] = '\0';
/* Old resultant spec for rename */
rnam = cc$rms_nam;
rnam.nam$l_esa = res;
rnam.nam$b_ess = sizeof( res ) -1;
rnam.nam$l_rsa = rrs;
rnam.nam$b_rss = sizeof( rrs ) -1;
rfab = cc$rms_fab;
rfab.fab$l_nam = &rnam;
rfab.fab$l_fna = onam.nam$l_rsa;
rfab.fab$b_fns = onam.nam$b_rsl;
if( $MATCHCOND( confirm, RENAME_CONFIRM) )
confirm = confirm_cmd( confirm, ors, nes );
if( !$MATCHCOND( confirm, ODS2_CONFIRM_ALL ) ) {
if( $MATCHCOND( confirm, ODS2_CONFIRM_YES ) ) {
confirm = RENAME_CONFIRM;
} else if( $MATCHCOND( confirm, ODS2_CONFIRM_NO ) ) {
confirm = RENAME_CONFIRM;
continue;
} else { /* ODS2_CONFIRM_QUIT */
sts = confirm;
break;
}
}
sts = sys_rename( &rfab, NULL, NULL, &nfab );
res[rnam.nam$b_esl] = '\0';
rrs[rnam.nam$b_rsl] = '\0';
nes[nnam.nam$b_esl] = '\0';
nrs[nnam.nam$b_rsl] = '\0';
if( $SUCCESSFUL(sts) ) {
renamecnt++;
if( options & rename_log )
sts = printmsg( RENAME_RENAMED, 0, rrs, nrs );
} else {
printmsg( RENAME_FAILED, 0,
rnam.nam$b_rsl? rrs: rnam.nam$b_esl? res: rfab.fab$l_fna,
nnam.nam$b_rsl? nrs: nnam.nam$b_rsl? nes: nfab.fab$l_fna );
sts = printmsg( sts, MSG_CONTINUE, RENAME_FAILED );
}
rfab.fab$b_fns =
rnam.nam$b_ess =
rfab.fab$b_dns = 0;
rnam.nam$b_nop = NAM$M_SYNCHK;
(void) sys_parse( &rfab );
if( $FAILED(sts) && $VMS_STATUS_SEVERITY(sts) > STS$K_WARNING )
break;
} /* search old files */
} while( 0 );
if( options & rename_log ) {
vmscond_t st2 = 0;
if( renamecnt > 1 ) {
st2 = printmsg( RENAME_NRENAMED, 0, renamecnt );
} else if( renamecnt == 0 && $SUCCESSFUL(sts) )
st2 = printmsg( RENAME_NOFILES, 0 );
if( $SUCCESSFUL(sts) )
sts = st2;
}
ofab.fab$b_fns =
onam.nam$b_ess =
ofab.fab$b_dns = 0;
onam.nam$l_rlf = NULL;
onam.nam$b_nop = NAM$M_SYNCHK;
(void) sys_parse( &ofab );
nfab.fab$b_fns =
nnam.nam$b_ess =
nfab.fab$b_dns = 0;
nnam.nam$l_rlf = NULL;
nnam.nam$b_nop = NAM$M_SYNCHK;
(void) sys_parse( &nfab );
return sts;
}