|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 4634 (0x121a)
Types: TextFile
Names: »move.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/quipu/dish/move.c«
/* move.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/move.c,v 7.0 89/11/23 22:20:16 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/dish/RCS/move.c,v 7.0 89/11/23 22:20:16 mrose Rel $
*
*
* $Log: move.c,v $
* Revision 7.0 89/11/23 22:20:16 mrose
* Release 6.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include "quipu/util.h"
#include "quipu/name.h"
extern DN dn;
#define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps)
#define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt)
extern char frompipe;
extern PS opt, rps;
extern char move_flag;
DN fixed_pos = NULLDN;
call_moveto (argc,argv)
int argc;
char ** argv;
{
char pwd_flag = FALSE;
char check_move = TRUE;
int x;
if (argc == 1) {
Usage (argv[0]);
return;
}
move_flag = FALSE;
for (x = 1; x < argc; x++) {
if (test_arg (argv[x],"-pwd",1))
pwd_flag = TRUE;
else if (test_arg (argv[x],"-nopwd",3))
pwd_flag = FALSE;
else if (test_arg (argv[x],"-check",1))
check_move = TRUE;
else if (test_arg (argv[x],"-nocheck",3))
check_move = FALSE;
else if (test_arg (argv[x], "-sequence",3)) {
if (x + 1 == argc) {
ps_printf (OPT, "We need a sequence name.\n");
return;
} else {
shuffle_up (argc--, argv, x);
set_sequence (argv[x]);
}
} else if (move (argv[x]) == OK) {
if (move_flag == TRUE) {
ps_print (RPS,"Too many parameters !\n");
Usage (argv[0]);
return;
}
move_flag = TRUE;
} else {
move_flag = FALSE;
if (*argv[x] != '-')
ps_printf (OPT,"Unknown entity '%s'\n",argv[x]);
else
Usage (argv[0]);
return;
}
}
if (check_move)
if (test_move_dn() != TRUE) {
move_flag = FALSE;
return;
}
if (move_flag == TRUE)
consolidate_move ();
if (pwd_flag) {
dn_print (RPS, fixed_pos, EDBOUT);
ps_print (RPS, "\n");
}
}
consolidate_move ()
{
if (move_flag) {
move_flag = FALSE;
dn_free (fixed_pos);
fixed_pos = dn_cpy (dn);
}
}
set_current_pos ()
{
move_flag = FALSE;
dn_free (dn);
dn = dn_cpy (fixed_pos);
}
move (arg)
char *arg;
{
extern int print_parse_errors;
DN user_down ();
DN str2dn_aux ();
DN sequence_dn();
DN tmpdn;
char * ptr;
char alias = FALSE;
print_parse_errors = FALSE;
if (*arg == '-') {
print_parse_errors = TRUE;
return (NOTOK); /* can't be a move if it starts with a minus */
}
if (*arg == '+')
arg++; /* old style call */
ptr = arg;
while (*ptr != 0) {
if (! isdigit (*ptr))
break;
ptr++;
}
if (*ptr == 0) {
/* sequence move */
dn_free (dn);
dn = dn_cpy (sequence_dn(atoi(arg)));
print_parse_errors = TRUE;
if (dn == NULLDN) {
ps_printf (OPT,"Invalid sequence number %s\n",arg);
return (NOTOK);
} else
return (OK);
}
if ((ptr = index (arg,'@')) != NULLCP) {
*ptr = 0;
if (*arg == 0) {
/* from root */
dn_free (dn);
dn = NULLDN;
*ptr ='@';
arg = ++ptr;
if (*arg == 0) {
print_parse_errors = TRUE;
return (OK); /* @ -> move to root */
}
if ((ptr = index (arg,'@')) != NULLCP)
*ptr = 0;
}
} else {
dn_free (dn);
dn = dn_cpy (fixed_pos);
}
if (strcmp (arg,"..") == 0) {
do {
DN dnptr;
DN trail;
if (dn == NULLDN) {
print_parse_errors = TRUE;
ps_print (OPT, "Can't go back past root\n");
return (NOTOK);
}
if (dn->dn_parent == NULLDN) {
dn_free (dn);
dn = NULLDN;
} else {
for (dnptr = dn; dnptr->dn_parent != NULLDN; dnptr = dnptr->dn_parent)
trail = dnptr;
dn_comp_free (dnptr);
trail->dn_parent = NULLDN;
}
if (ptr == NULLCP) {
print_parse_errors = TRUE;
return (OK);
}
arg = ++ptr;
if ((ptr = index (arg,'@')) != NULLCP)
*ptr = 0;
} while (strcmp (arg,"..") == 0);
}
if (ptr != NULL)
*ptr = '@';
if ((tmpdn = str2dn_aux (arg,&alias)) != NULLDN) {
if (dn == NULLDN)
dn = tmpdn;
else {
if (alias) {
dn_free (dn);
dn = tmpdn;
} else
dn_append (dn,tmpdn);
}
print_parse_errors = TRUE;
return (OK);
} else {
print_parse_errors = TRUE;
return (NOTOK);
}
}
test_move_dn ()
{
char * name = "moveto";
/* Might do something else here... */
/* current policy is to read the entry and cache it ! */
if (dn == NULLDN)
return (TRUE); /* assume root exists - read will fail */
return (read_cache (1,&name));
}