; DEMIME64
;
; Program for Proteus
;
; (C) 1998-2004 Simone Zanella Productions
;
; This program decodes the specified file (encoded according to Mime Base 64)
; into the original file. If the file exists, it is overwritten;
; only single section files are allowed.
; Implicit parameters: input and output are NULL
;!proteus -z
IF ISEMPTY(ARGV(5))
CONSOLELN "Syntax: " ARGV(1) " " ARGV(2) \
" [filename [destination]]"
CONSOLELN ""
CONSOLELN "Purpose: decode a Mime Base 64-encoded file."
CONSOLELN "If destination file exists, it is overwritten."
CONSOLELN "If \"destination\" is specified, that name is " \
"used for destination."
CONSOLELN "Only single section files are allowed."
ABORT 0
FI
H = FOPEN(ARGV(5), 1)
IF EQ(H, -1)
CONSOLELN "File \"" ARGV(5) "\" not found."
ABORT 1
FI
Found = 0
Status = 0
B64Par = VECCREATE(0, 0, 0)
WHILE NOT(FEOF(H))
; Find two lines starting with "Content"
S = FREADLN(H)
IF IMATCH(S, "Content*")
IF ISNOTEMPTY(ARGV(6))
DstName = ARGV(6)
ELSE
REXIMATCH(S, "name=")
DstName = RESTFROM(S, ADD(R_START, R_LENGTH))
ALLTRIM(@DstName, " ")
STRIPQUOTES(@DstName)
FI
S = FREADLN(H)
IF IMATCH(S, "Content*")
; Find the first non-empty line
S = ""
WHILE AND(NOT(FEOF(H)), ISEMPTY(S))
S = FREADLN(H)
LOOP
IF FEOF(H)
CONSOLELN "Unexpected end of file in \"" ARGV(5) "\"."
ABORT 1
FI
HD = FOPEN(DstName, 26)
IF EQ(HD, -1)
CONSOLELN "Could not create \"" DstName "\"."
ABORT 1
FI
WHILE ISNOTEMPTY(S)
DEMIME64(@S, @Status, B64Par)
FWRITE(HD, S)
SWITCH Status
ON -2
CONSOLELN "Error decoding file \"" ARGV(5) "\"."
ABORT 0
ON 1
BREAK
ON 0
S = FREADLN(H)
OFF
LOOP
Found = 1
BREAK
FI
FI
LOOP
VECFREE(B64Par)
FCLOSE(H)
IF Found
CONSOLELN "File \"" DstName "\" created."
ELSE
CONSOLELN "No Mime Base 64 section found into \"" ARGV(5) "\"."
ABORT 1
FI
ABORT 0