: UPDATE DIENT ZUR HERSTELLUNG GLEICHER ORDNER INCL. UNTERORDNER
: AUFRUF: UPDATE [-N] SOURCE_ORDNER > DESTINATION_ORDNER
: URVERSION VOM: 15-03-1994
:                05-05-1994  SCHNELLERES PARSEN BEI 1 UND 2 PARAMETERN
:                08-04-1998  UPDATE funktiontiert nun auch ueber Netz 
:                10-07-1998  BUG MIT **FREE** VON FLOPPY BESEITIGT
:                11-08-1998  Pfade zu lang(DPATH, SPATH), wenn Partner
:                            im Netz nur 24 Zeichen Pfadlaenge hat.
:                04-02-1999  Abfrage nach "Ordner anlegen" korrigiert
:                31-03-1999  Ausgabe kopierter Files by UPDATE-N

: SYSTEMZEIT DIESER VERSION: 01:00  31-03-1999
FEHLER='0'; 
NAFRA='JA'; : ANNHAME: UEBERSPIELEN VON SOURCE NACH DESTIN. MIT FRAGE
: ANALYSE DER EINGABEZEILE (3 PARAMETER !!!)
: ECHO $# 'Uebergabeparameter gefunden';
: VARIABLENANFANG:
:   S BEZEICHNET SOURCE-VARIABLEN
:   D BEZEICHNET DESTINATION VARIABLEN
:   A BEZEICHNET AKTUELLE(BZGL. DEM  GERADE BEARBEITETEN FILE) NAMEN
IF TEST $# -GT '0'; THEN 
  IF TEST ($1='-N' -O $1='-n') -A $1 != '-x' -A $1 != '-xx' ; THEN
    NAFRA='NEIN';  : KEINE NACHFRAGE ERWUENSCHT !!! 
    SHIFT;
  FI;
  IF TEST $# ='1'; THEN
    IF TEST $1= '-?' -A $1 = '-x' -A $1 != '-xx'; THEN
      FEHLER='1';
    FI;
  FI;  
FI;
IF TEST $# -LT '1' -O $# -GT '3'; THEN   : NUR 1,2 ODER 3 IST i.O.
  FEHLER='6';  : FALSCHE PARAMETERZAHL
FI;
IF TEST $FEHLER = '0';THEN  
  CASE $# IN    : SWITCH FUER ANZAHL DER PARAMETER
  1|2) : 'SRCE >'       '> DEST'    'SRCE> DEST'     'SRCE >DEST'    
       : '>DEST SRCE'   'SRCE>DEST'  
    IF TEST $#='2'; THEN
      CH=SEG[1,1]($1);
      LENUEB=LEN($1);     
      IF TEST $CH= '>' -A $CH != 'x' -A  $LENUEB != '1'; 
      THEN
        NUM=LEN($2); 1=$2$1;  : ERSTER FALL, 2. ZEILE DER MOEGLICHKEITEN
      ELSE
        NUM=LEN($1); 1=$1$2;  : HIER STEHT DEST HINTER SOURCE
      FI;  
    ELSE
      NUM='1';
    FI;
    LENUEB=LEN($1);
    WHILE TEST $NUM -LE $LENUEB;
    DO
      CH=SEG[$NUM,$NUM]($1);
      IF TEST $CH= '>' -A $CH != 'x'; THEN
        : '>' GEFUNDEN, SEPARIERUNG MOEGLICH
        #=0;  : MELDUNG: AUFDROESELUNG MOEGLICH
        IF TEST $NUM = '1'; THEN                       : '>DEST'
          SF='';  DF=SEG[2,$LENUEB]($1);
        ELSE
          IF TEST $NUM=$LENUEB; THEN                   : 'SRCE>'
            SF=SEG[1,EXPR($LENUEB-1)]($1); DF='';
          ELSE                                         : 'SRCE>DEST'
            SF=SEG[1,EXPR($NUM-1)]($1);
            DF=SEG[EXPR($NUM+1),$LENUEB]($1);
          FI;
        FI;
        BREAK;
      FI;
      NUM=EXPR($NUM+1);
    DONE;
    IF TEST $# !='0'; THEN FEHLER='2'; FI;
  ;;
  3)  : ACH IST DAS SCHOEN; RICHTIG EINFACH PARSEN
    IF TEST $1='>' -A $1 != 'x'; THEN
      SF=$3; DF= $2;
    ELSE
      IF TEST $2='>' -A $1 != 'x'; THEN
        SF=$1; DF=$3;
      ELSE
        FEHLER='2'; 
      FI;                  
    FI;
  ;;
  ESAC;
FI;
TMPNAM=SEG[,3]($0)SEG[EXPR(LEN($0)-5),EXPR(LEN($0))]($0);
IF TEST $FEHLER ='0'; THEN
:  DPATH=/ED/PUB/BLAJHUPIO/KK7/LLLKRD;
  DPATH=/ED/PUB/D${TMPNAM};

  IF TEST $DF=''; THEN DF=$WORKDIR; FI;
  IF TEST SEG[1,1]($DF) != '/'; THEN DF=$WORKDIR/$DF; FI;
  
  IF TEST SEG[1,1]($DF) != '/'; THEN DF=$WORKDIR/$DF; FI;
  IF O $DPATH ER /NIL; DIR-E $DF; THEN
    REWIND $DPATH; I $DPATH; READ ZEILE;
    SET $ZEILE; DPM=$3; : gemeldeter Pfad-Name 
  ELSE
    FEHLER='4';
  FI;
FI;
IF TEST $FEHLER ='0'; THEN
:  SPATH=/ED/PUB/BLAJHUPIO/KK7/LLLKRS;
  SPATH=/ED/PUB/S${TMPNAM};
  IF TEST $SF=''; THEN SF=$WORKDIR; FI;
  IF TEST SEG[1,1]($SF) != '/'; THEN SF=$WORKDIR/$SF; FI;
  IF "O $SPATH; ER /NIL; DIR-EA $SF"; THEN 
    REWIND $SPATH; I $SPATH; READ ZEILE;
    SET $ZEILE; SPM=$3;   : gemeldeter Pfad-Name 
  ELSE
    FEHLER='3';
  FI;
FI;
UNSET $TMPNAM;
IF TEST $FEHLER = '0'; THEN
  : ggf. Netzdevice und Device extrahieren
  DNET='';
  CH=''; 
  LC='3';  : DEVICE BEGINNT MIT /xx. 2. '/' FRUEHESTENS AB 4. STELLE
  IF TEST $DF = '/S'* -o $DF = '/s'*; THEN 
    : Netzanpassung;
    WHILE TEST $CH != '/';
    DO
      LC=EXPR($LC+1);
      CH=SEG[$LC,$LC]($DF);
    DONE
    DNET=SEG[1,EXPR $LC-1]($DF);
    CH=''; LC='3';
  FI;
  DF=$DPM;
  WHILE TEST $CH != '/';
  DO
    LC=EXPR($LC+1);  CH=SEG[$LC,$LC]($DF);
  DONE
  DDEV=SEG[1,EXPR $LC-1]($DF); 
  
  SNET='';
  CH='';
  LC='3';  : DEVICE BEGINNT MIT /xx. 2. '/' FRUEHESTENS AB 4. STELLE
  IF TEST $SF = '/S'* -o $SF = '/s'*; THEN 
    : Netzanpassung;
    WHILE TEST $CH != '/';
    DO
      LC=EXPR($LC+1);
      CH=SEG[$LC,$LC]($SF);
    DONE
    SNET=SEG[1,EXPR $LC-1]($SF);
    CH=''; LC='3';
  FI;
  SF=$SPM;
  WHILE TEST $CH != '/';
  DO
    LC=EXPR($LC+1);
    CH=SEG[$LC,$LC]($SF);
  DONE;
  SDEV=SEG[1,EXPR $LC-1]($SF); 
FI;  
IF TEST $FEHLER ='0'; THEN
  IF TEST $SNET$SF = $DNET$DF; THEN      : SOURCE UND DESTINATION IDENTISCH
    FEHLER='5'; RM $DPATH' '$SPATH;
  FI;
FI;

IF TEST $FEHLER != '0'; THEN
  CASE $FEHLER IN
  1)                                                ;;
  2)  ECHO "Fehler: Kein '>' gefunden oder '>' an falscher Stelle";  ;;
  3)  ECHO 'Fehler: Quellordner nicht vorhanden';   ;;
  4)  ECHO 'Fehler: Zielordner nicht vorhanden';    ;;
  5)  ECHO 'Fehler: Source und Destination identisch'; ;;
  6)  ECHO 'Fehler: Falsche Parameterzahl';         ;; 
  ESAC
  ECHO 'Update dient zum Abgleichen zweier Ordner einschliesslich Unterordner:';
  ECHO 'Ist eine Datei des Quellordners nicht oder in aelterer Version im Zielordner';
  ECHO 'wird nachgefragt, ob das Zielfile aktualisiert werden soll. Ist eine Datei des';
  ECHO 'Zielordners nicht im Quellordner, wird nachgefragt, ob das Zielfile geloescht';
  ECHO 'werden soll oder ob Quellfile anzulegen ist. Ist das Quellfile aelter, kommt ';
  ECHO 'kommt eine Nachfrage bzgl. Aktualisierung des Quellfiles';
  ECHO 'Mit der Option -N werden Nachfragen bzgl. CP SOURCE > DEST. unterdrueckt';
  ECHO 'Syntax:';
  ECHO 'UPDATE [-N] source > destination oder';
  ECHO 'UPDATE [-N] > destination source';
  ECHO "Beispiel:  'UPDATE /H0/XD > /F0/XD' gleicht /H0/XD mit /F0/XD ab."; 
  ECHO 'Fuer "destination" und "source" wird das Working-Directory ausgewertet';
  EXIT(0);
FI;

: MOUNTEN DER DESTINATION ; 
IF O /NIL; ER /NIL; CF $DNET$DDEV/MOUNT; THEN 
  ECHO $DNET$DDEV gemounted; 
FI;    

: MOUNTEN DES SOURCE; 
IF O /NIL; ER /NIL; CF $SNET$SDEV/MOUNT; THEN
  ECHO $SNET$SDEV gemounted; 
FI;    


ZW=EXPR (LEN($SF)-1); SF=SEG[1,$ZW]($SF);
ZW=EXPR (LEN($DF)-1); DF=SEG[1,$ZW]($DF);
ECHO 'UPDATE: Source:      '$SNET$SF;
ECHO '        Destination: '$DNET$DF;


PASS='1';
: NUN GEHT DAS GEROEDEL LOS 
WHILE TEST $PASS !='3'
DO
  ECHO 'Starte Pass '$PASS;
  REWIND $SPATH; UPD='JA'; ENDE='0';
  SFL=EXPR(LEN($SF)+2);
  WHILE TEST $ENDE != '1'
  DO
    I $SPATH; READ ZEILE; SET $ZEILE;
    IF TEST $EOF='1'; THEN ENDE='1';FI;
    IF TEST $1=*??'-DIRECTORY'; THEN      
      : EINLAEUTEN EINES NEUEN DIRECTORIES
      IF TEST $UPD='NEIN'; THEN
        : LETZTER ORDNER DURFTE NICHT AKTUALISIERT WERDEN
        IF TEST SEG[1,$NOFOLDL]($3) != $NOFOLD; THEN UPD='JA';  FI;
      FI;
      IF TEST $UPD='JA'; THEN
        : DER LETZTE BEKAM EIN UPDATE ODER NEUE HIERARCHIESTUFE
        ADIR=''; UPD='JA'; : ANNAHME: UPDATE DES NEUEN ORDNERS
        IF TEST $3 != $SF/; THEN
          ADIR=SEG[$SFL,]($3); : HINTER $SF BIS ENDE 
          ZW=EXPR(LEN($ADIR)-1); 
          ZW=SEG[,$ZW]($ADIR); 
          REWIND $DPATH;
          IF "O $DPATH; ER /NIL; DIR-E $DNET$DF/$ZW"; THEN
          ELSE
            ECHO-N 'Ordner anlegen?: '$DNET$DF/$ADIR' ([J]/N) ';
            READ-E CH; ECHO
            IF TEST $CH='J' -O $CH ='j' -O TOFIX($CH)='13'; THEN
              IF " MKDIR $DNET$DF/$ZW"; THEN FI;
            ELSE
              : ORDNER MERKEN, DER UPDATE AUSSCHALTET
              UPD='NEIN'; NOFOLD=$3; NOFOLDL=LEN($3); 
              IF TEST $PASS='2'; THEN
                ECHO-N 'Ordner entfernen?: '$SNET$SF/$ADIR' (J/[N])';
                READ-E CH; ECHO;
                IF TEST $CH='J' -O $CH='j'; THEN
                  WAIT; /H0/XD/RMD -AN $SNET$SF/$ADIR''*--
                  IF "O /NIL; ER/NIL; RMDIR $SNET$SF/$ZW"; THEN FI;
                FI;
              FI;
            FI; : TEST $CH  
          FI;  : TEST DIR
        FI;  : TEST $3  
      FI;  : TEST UPD=JA
    ELSE
      IF TEST $1!='**FREE**'; THEN
        : ORDNER ODER FILE-EINTRAG
        AFIL=$1; ADAT=$4; ACLK=$3; ZW=LEN($AFIL);
        CH=SEG[$ZW,$ZW]($1);
        IF TEST $UPD != 'NEIN' -A $CH != '/'; THEN
          : NUR BEI UPDATE = JA UND BEI FILE-EINTRAG AUSFUEHREN 
          A='JA'; : ANNAHME: MUSS AKTUALISIERT WERDEN
          REWIND $DPATH; DENDE=0; LC='Anleg';
          WHILE TEST $DENDE = '0';
          DO
            I $DPATH; READ DDAT; DENDE=$EOF; SET $DDAT; 
            IF TEST $AFIL = $1; THEN 
              DENDE=2; LC='Aktualisier'; BREAK; 
            FI;
          DONE;
          IF TEST $DENDE = '2'; THEN
            DDAT=$3'  '$4;
            ZW=EXPR(SEG[7,10]($ADAT)-1984);    : SOURCE-JAHR BESTIMMEN
            ADAT=$ZW''SEG[4,5]($ADAT)SEG[1,2]($ADAT);
            ZW=EXPR(SEG[14,17]($DDAT)-1984); : JAHR AUF 1984 RELATIVIERT
            ZW=$ZW''SEG[11,12]($DDAT)SEG[8,9]($DDAT);
            IF TEST $ADAT -LT $ZW; THEN A='NEIN'; FI;
            IF TEST $ADAT = $ZW; THEN : SOURCEDATUM GLEICHALT
              ACLK=SEG[1,2]($ACLK)SEG[4,5]($ACLK);
              ZW=SEG[1,2]($DDAT)SEG[4,5]($DDAT);
              IF TEST $ACLK -LE $ZW; THEN A='NEIN'; FI;
            FI;    
          FI;  : IF FILE AUF DESTINATION GEFUNDEN
          IF TEST $A='JA'; THEN  : AKTUALISIERUNG NOTWENDIG;
            CH='J'; 1=$SNET$SF/$ADIR$AFIL; 2=$DNET$DF/$ADIR$AFIL;
            IF TEST $NAFRA='JA'; THEN
              ECHO-N $LC'en?: '$2' ([J]/N)'; READ-E CH; ECHO;
            ELSE
              ECHO CP PRIO 15 $1>$2;
            FI;
            IF TEST $CH='J' -O $CH='j' -O TOFIX($CH)='13'; THEN 
              WAIT;CP PRIO 15 $1>$2--;
            ELSE
              IF TEST $PASS='2' -A $DENDE='1'; THEN
                ECHO-N 'Entfernen?: '$1' (J/[N]) (Abbruch mit A) '; READ-E CH; ECHO;
                IF TEST $CH='J' -O $CH='j'; THEN RM $1; FI;
                IF TEST $CH='A' -O $CH='a'; THEN BREAK; FI;
              FI;
            FI;
          FI;
        FI;  : OF UPDATE UND FILEEINTRAG
      FI;  : OF IF TEST $1!='**FREE**' ...
    FI;  : NEUER ORDNER ODER NICHT
  DONE;
  PASS=EXPR($PASS+1);
  RM $SPATH $DPATH;
  IF TEST $PASS='2'; THEN 
    : SOURCE WIRD ZUR DEST U.U.
    ZW=$DF;   DF=$SF;      SF=$ZW;
    ZW=$DNET; DNET=$SNET;  SNET=$ZW;
    ZW=$DDEV; DDEV=$SDEV;  SDEV=$ZW;
    O $DPATH; DIR-E $DNET$DF;   
    O $SPATH; DIR-EA $SNET$SF; NAFRA='JA';
  FI;
DONE;


IF O /NIL; ER /NIL; CF $DNET$DDEV/UMNT; THEN; 
  ECHO $DNET$DDEV geschlossen; 
FI;    
IF O /NIL; ER /NIL; CF $SNET$SDEV/UMNT; THEN; 
  ECHO $SNET$SDEV geschlossen; 
FI;    

EXIT(-1);
