ACSCCRA@UBVMSC.CC.BUFFALO.EDU ("Curtis R. Anderson") (05/19/88)
Seeing some of the more interesting files and collections that have been posted to INFO-VAX, I offer a utility that was originally written as a quick patch to take files mailed by Internet, which can convert a tab to four blanks. This program turns four blanks in sequence back to a tab. I can't say much as to its usefulness, but give it a shot, anyway... I must apologize for the fact that the program isn't as 'polished' as it should be. I wanted to handle wildcards, but I didn't get it in this version. Enjoy... --Curtis R. Anderson acsccra@ubvms.bitnet acsccra@ubvmsc.cc.buffalo.edu acsccra@sunybcs.uucp ....................... Cut between dotted lines and save ...................... $!.............................................................................. $! VAX/VMS archive file created by VMS_SHAR V-5.01 01-Oct-1987 $! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au) $! To unpack, simply save and execute (@) this file. $! $! This archive was created by ACSCCRA $! on Thursday 19-MAY-1988 10:46:17.77 $! $! It contains the following 4 files: $! TABBER.PAS TABBERM.MSG TABBER.CLD TABBER.HLP $!============================================================================== $ Set Symbol/Scope=(NoLocal,NoGlobal) $ Version=F$GetSYI("VERSION") ! See what VMS version we have here: $ If Version.ges."V4.4" then goto Version_OK $ Write SYS$Output "Sorry, you are running VMS ",Version, - ", but this procedure requires V4.4 or higher." $ Exit 44 $Version_OK: CR[0,8]=13 $ Pass_or_Failed="failed!,passed." $ Goto Start $Convert_File: $ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd $No_Error1: Define/User_Mode SYS$Output NL: $ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' - VMS_SHAR_DUMMY.DUMMY f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f); o:=Get_Info(Command_Line,"Output_File");Set(Output_File,b,o); Position(Beginning_of(b));Loop x:=Erase_Character(1);Loop ExitIf x<>"V"; Move_Vertical(1);x:=Erase_Character(1);Append_Line; Move_Horizontal(-Current_Offset);EndLoop;Move_Vertical(1); ExitIf Mark(None)=End_of(b) EndLoop;Position(Beginning_of(b));Loop x:=Search("`",Forward,Exact);ExitIf x=0;Position(x);Erase_Character(1); If Current_Character='`' then Move_Horizontal(1);else Copy_Text(ASCII(INT(Erase_Character(3))));EndIf;EndLoop;Exit; $ Delete VMS_SHAR_DUMMY.DUMMY;* $ Checksum 'File_is $ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR $ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd $No_Error2: Return $Start: $ File_is="TABBER.PAS" $ Check_Sum_is=53169703 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY Xprogram Tabber(Input, Output, InFile, OutFile); X(* X * tabber X * installs tabs in place of 4 blanks X * X * Curtis r. anderson X * University Computing Services student consultant X * State University of New York at Buffalo X * X * bitnet: acsccra@ubvms.bitnet X * internet: acsccra@ubvmsc.cc.buffalo.edu X * X * Since ARPA sends out files with four blanks in place of a tab, this X * program is intended to put the tab back in where the blanks existed. This X * is useful for converting the .crclst files it sends, and several other X * programs which use tabs and are sent 'raw' over SIMTEL20. X * X * development history: X * X * 1.00a - 19-may-87: Turbo Pascal version for use in cp/m and ms-dos X * environments. X * 2.00a - 19-may-87: VAX Pascal version for use in VAX/VMS environments. X * 2.00b - 01-jun-87: Corrected a few small problems before release. X * Tightened up comments. X * 2.1-003,02-sep-87: Making more VMS-able, providing CLI and Message support. X * X * CP/M is a registered trademark of Digital Research, Inc. X * MS-DOS is a registered trademark of Microsoft, Inc. X * VAX, VMS are registered trademarks of Digital Equipment Corporation. X *) X Xconst X Spaces = ' '; X Tab X(* there is a TAB inside the quotes. If you received this file via ARPA, you X * will have to use an editor to reinstall the tab again, which is exactly the X * intended purpose of this program! X *) = '`009'; X X(* VAX/VMS specific constants: CLI Condition Values *) X X CLI$_ABSENT = %X'000381F0'; X CLI$_NEGATED`009`009`009`009= %X'000381F8'; X CLI$_LOCNEG`009`009`009`009= %X'00038230'; X CLI$_PRESENT = %X'0003FD19'; X CLI$_DEFAULTED`009`009`009= %X'0003FD21'; X CLI$_LOCPRES`009`009`009`009= %X'0003FD31'; X X(* VAX-11 Message values compiled for this program: *) X X TAB_COMPLETED = %X'080A8009'; X TAB_OPENED = %X'080A8013'; X Xtype X Line = Varying[80] of Char; (* for VAX *) X RMSFileSpecification = Varying[255] of Char; X Xvar X Verbose : Boolean; X Cond`009`009`009`009`009: Integer; X InFileName, OutFileName : RMSFileSpecification; X InFile, OutFile : Text; X CommandLength : Integer; X X[EXTERNAL, ASYNCHRONOUS] function LIB$SIGNAL( X %IMMED condition `009`009: [UNSAFE] Integer; X %IMMED FAO_Params : [UNSAFE, LIST] Integer) X`009`009`009`009`009: [UNSAFE] Unsigned; X X Extern; X X[EXTERNAL] function CLI$GET_VALUE( X %DESCR entity_desc : Line; X %DESCR retdesc : RMSFileSpecification; X %REF retlength : Integer := %IMMED 0) X : Integer; XExtern; X X[EXTERNAL] function CLI$PRESENT( X %DESCR entity_desc : Line) X : Integer; XExtern; X X[EXTERNAL] procedure Message( X %IMMED Id : Integer; X %IMMED FAOVal : Unsigned := %IMMED 0); X XExtern; X Xprocedure ProcessFile( X var InP : Text; X var OutP : Text X); X Xvar X I : Integer; X InpLine : Line; X Xbegin X repeat X ReadLn(InP, InpLine); X if Length(InpLine) <= 4 then X WriteLn(OutP, InpLine) (* no tabs in such a short line! *) X else X begin X I := 1; X while (I <= Length(InpLine) - 3) do X begin X if SubStr(InpLine, I, 4) = Spaces then (* VAX *) X begin X Write(OutP, Tab); X I := I + 3; X end X else X begin X Write(OutP, SubStr(InpLine, I, 1)); (* VAX *) X end; (* if *) X I := I + 1; X end; (* while *) X WriteLn(OutP, SubStr(InpLine, Length(InpLine) - 2, 3)); (* VAX *) X end; (* if *) X until EOF(InP); Xend; X Xbegin (* main *) X (* begin VAX *) X InFileName := ''; X CommandLength := 0; X while (CLI$GET_VALUE('INFILE', InFileName, CommandLength) <> CLI$_ABSENT) X do X begin X Cond := CLI$PRESENT('VERBOSE'); X if (Cond = CLI$_PRESENT) or (Cond = CLI$_LOCPRES) then X Verbose := True; X if (Cond = CLI$_LOCPRES) or (Cond = CLI$_LOCNEG) or (Cond = CLI$_DEFAULTED) X then X Verbose := False; X Open(InFile, InFileName, History := old); X Open(OutFile, InFileName, History := new); (* end VAX *) X Reset(InFile); X ReWrite(OutFile); X if Verbose then X LIB$SIGNAL(TAB_OPENED, 1, %STDESCR InFileName); X ProcessFile(InFile, OutFile); X if Verbose then X LIB$SIGNAL(TAB_COMPLETED, 1, %STDESCR InFileName); X Close(InFile); X Close(OutFile) X end; Xend. $ GoSub Convert_File $ File_is="TABBERM.MSG" $ Check_Sum_is=1278817165 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X`009`009.title`009`009TABBER X`009`009.ident`009`009"V1.0-001" X`009`009.facility`009TABBER,10/prefix=TAB_ X`009`009.severity`009success XCOMPLETED`009<File !AS converted sucessfully>/FAO_COUNT=1 X`009`009.severity`009informational XOPENED`009`009<File !AS has been opened>/FAO_COUNT=1 X`009`009.end $ GoSub Convert_File $ File_is="TABBER.CLD" $ Check_Sum_is=1394634515 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY V!************************************TABBER************************************ X* Xdefine verb TABBER X! X! change "image" to point to the directory the program is installed in. X! X image TABBER.EXE X parameter P1 , prompt="File" X value (required,list,type=$file) X qualifier LOG X placement=positional X qualifier OUTFILE X value (required,type=$file) X placement=local X qualifier EXCLUDE_FILE X value (required,list,type=$file) X placement=local $ GoSub Convert_File $ File_is="TABBER.HLP" $ Check_Sum_is=604384893 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X1 TABBER X X TABBER is a facility which, when invoked, will replace a series of X four blanks with a tab. Now, one will ask why this is done; the X reason is that the Internet will convert a tab to four blanks when X the mailers mail files to various Internet sites. This program will X dutifully restore ANY four blanks, even ones not intended to be X replaced, with a tab. This will help in interpreting some of the X news articles originally posted to USENET and gatewayed to the X Internet special interest groups (SIG's). If one receives a C X program with many tabs in it via Internet, TABBER will put a sense of X order back into the program that was lost in the mailing. X X Format: X X TABBER file-spec[,...] X X2 Parameters X X file-spec X X One or more files in a list to be tabbed. The tabbed files will be X of the same name, but with an increased version number. X X2 Command_Qualifiers X X/LOG X X /NOLOG (default) X /LOG X X Enables transmission of all messages to the console of severity X SUCCESS and INFORMATIONAL. Otherwise, these messages are supressed, X to keep from cluttering up the screen when many files are tabbed. X X2 Errors X X In general, the term "error" is used to describe any of the system X messages generated by this program of the form: X X %FACILITY-I-MSGID, Message text X X where: X X FACILITY is the name of the utility in question; X I is the severity of the message, where the letter is S, I, W, X E, or F; X MSGID is a mnemonic of up to nine letters in length. Normally, X the HELP entries for "Errors" will be constructed with the X MSGID values for keys. When this program gives a message X for a reason that you don't understand, please check the X HELP entry to see why the message was generated. X X3 INFILE X X MESSAGE: %TABBER-I-INFILE X X TEXT: Input file is <tabbed-file> X X EXPLANATION: X TABBER sucessfully parsed and opened the file specified in X the command line. Normally supressed by the /NOLOG X qualifier. X X3 COMPLETED X X MESSAGE: %TABBER-S-COMPLETED X X TEXT: X X EXPLANATION: X TABBER sucessfully tabbed the file and closed it. X X2 Author X X Curtis R. Anderson (ACSCCRA@UBVMS.BITNET) X (ACSCCRA@UBVMSC.CC.BUFFALO.EDU) $ GoSub Convert_File $ Exit