DOpus4-FromB64.rexx
/*
 *  $VER: DOpus4-FromB64 1.0 (1 Jul 2015) by Wizardry and Steamworks
 *
 *      © 2015 Wizardry and Steamworks
 *
 *  PROGRAMNAME:
 *      DOpus4-FromB64
 *
 *  FUNCTION:
 *      Decodes a file from Base64 and copies the resulting file to the other pane.
 *
 *  USAGE:
 *      ARexx command DOpus4-FromB64.rexx (from DOpus)
 *
 *  $HISTORY:
 *
 *  1 Jul 2015 : 1.0 : initial release
 *
 */
 
/*------- Configuration Variables (change these to suit your setup) --------*/
ChunkSize = 64          /* The chunk size to read: must be a multiple of 4. */
/*--------------------------------------------------------------------------*/
 
Opus = Address()    /* Get the DOpus address. */
Options RESULTS     /* Request results. */
Address value Opus  /* Use the DOpus address. */
 
Busy On             /* Set the busy pointer. */
 
Status 3                    /* Get this window. */
ThisWindow = RESULT
ThatWindow = ~ThisWindow    /* That window is not this window. */
 
/* Get this path. */
Status 13 ThisWindow
ThisPath = RESULT
If ThisPath = 'RESULT' Then
    Do
        TopText "No path in this window!"
        Busy Off
        Exit
    End
 
/* Get that path. */
Status 13 ThatWindow
ThatPath = RESULT
If ThatPath = 'RESULT' Then
    Do
        TopText "No path in that window!"
        Busy Off
        Exit
    End
 
GetSelectedAll '*' ThisWindow  /* Get all the selected items. */
Items = RESULT
If Items = 'RESULT' Then                /* If no items in this window then bail. */
    Do
        TopText "No items selected in this window!"
        Busy Off
        Exit
    End
 
/* Normalize, heh... */
Items = Translate(Translate(Items, '/', ' '), ' ', '*')
 
Count = Words(Items)    /* Get the number of selected items. */
If n <= 0 Then          /* Check if no items were selected. */
    Do                  /* If no items were selected, */
        Busy Off        /* turn off the busy pointer. */
        Exit            /* and terminate. */
    End
 
Do i = 1 To Count
    Name = Translate(Word(Items, i), ' ', '/')
    ScrollToShow Name
    NewName = Name
    Count = Length(NewName)
    If SubStr(NewName, Count-3) = '.b64' Then
        Do
            NewName = DelStr(NewName, Count-3)
        End
    If wasFileFromBase64(ThisPath||Name, ThatPath||NewName, ChunkSize, 'TopText "Reading Base64 Characters ["Count"]"') ~= 1 Then
        Do
            TopText "Failed to convert file: "Name
            Iterate i
        End
    TopText "Converted file: "Name
    Call wasDOpus4DeselectEntry(Name)
    Rescan ThatWindow
End
 
If n ~= 1 Then Rescan ThatWindow
 
TopText "<(^.-)> There you go!"
 
Busy Off    /* Turn off the busy pointer. */
Exit        /* Terminate. */
 
/*************************************************************************/
/*    Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3    */
/*************************************************************************/
wasFileFromBase64: procedure /* Decodes a file from Base64.              */
    Parse ARG Ins,Ous,Chunk,Lambda
 
    If Chunk // 4 ~= 0 Then Return 0
 
    If Open('ins', Ins, 'READ') ~= 1 | Open('ous', Ous, 'WRITE') ~= 1 Then 
        Return 0
 
    b64 =,
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
 
    Count = 0
    Do While ~Eof('ins')
        Segment = ''
        Do While Length(Segment) ~= Chunk & ~Eof('ins')
            c = ReadCh('ins', 1)
            Select
                When Pos(c, b64) = 0 Then Nop
                Otherwise Segment = Segment||c
            End
        End
        If Length(Segment) // 4 ~= 0 Then
            Do
                Close('ins')
                Close('ous')
                Return 0
            End
        Segment = wasBase64Decode(Segment)
        Length = Length(Segment)
        Interpret Lambda
        If WriteCh('ous', Segment) ~= Length Then
            Do
                Close('ins')
                Close('ous')
                Return 0
            End
        Count = Count + Length
    End
 
    Close('ins')
    Close('ous')
 
Return 1
 
/*************************************************************************/
/*    Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3    */
/*************************************************************************/
wasBase64Decode: procedure /* Decodes a Base64 string.                   */
    Parse ARG String
 
    Count = Length(String)
 
    If Count = 0 Then Return ''
 
    Pad = ''
    Select
        When SubStr(String, Count-1, 2) = '==' Then Pad = 'AA'
        When SubStr(String, Count, 1) = '=' Then Pad = 'A'
        Otherwise Nop
    End
 
    String = SubStr(String, 1, Length(String) - Length(Pad))||Pad
 
    b64 =,
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
 
    Count = Length(String)
    Result = ''
    Do i = 1 To Count By 4
        b1 = Pos(SubStr(String, i, 1), b64) - 1
        b2 = Pos(SubStr(String, i+1, 1), b64) - 1
        b3 = Pos(SubStr(String, i+2, 1), b64) - 1
        b4 = Pos(SubStr(String, i+3, 1), b64) - 1
        r1 = b1 * 4 + b2 % 16
        r2 = 16 * (b2 // 16) + (b3 % 4)
        r3 = 64 * (b3 // 4) + b4
        Result = Result||D2C(r1)||D2C(r2)||D2C(r3)
    End
 
Return SubStr(Result, 1, Length(Result) - Length(Pad))
 
/*************************************************************************/
/*    Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3    */
/*************************************************************************/
wasDOpus4DeselectEntry: procedure   /* Deselect a selected entry.        */
    Parse ARG Item
 
    GetAll '*'
    AllItems = RESULT
    AllItems = Translate(Translate(AllItems, '/', ' '), ' ', '*')
 
    n = Words(AllItems)
 
    Do i = 1 To n
        If Item = Translate(Word(AllItems, i), ' ', '/') Then
            Do
                SelectEntry i - 1 ||' '|| 0 ||' '|| 1
                Return
            End
    End
 
Return

amiga/directoryopus/4/base64/from.txt · Last modified: 2022/04/19 08:28 by 127.0.0.1

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.