#! /bin/sh # $Header: /home/jerry/.bin/RCS/showmult,v 1.3 92/08/10 11:39:56 jerry mh_contrib $ ### showmult - show multiple MH messages; pass as separate files to pager ### Usage (in MH profile): mhl: -moreproc showmult ## ## showmult FIXES AN IRRITATING MH show PROBLEM: BY DEFAULT, MH WITH mhl ## READS ALL THE MESSAGE FILES YOU WANT TO SEE AT ONCE AND PIPES THEM ALL ## TO YOUR PAGER (LIKE more). SO, YOU CAN'T ASK THE PAGER TO JUMP BACK ## AND FORTH WITHIN OR BETWEEN THE MESSAGES. ## ## showmult WORKS AROUND THIS BY FEEDING THE INDIVIDUAL FILES FROM THE ## mhl OUTPUT TO csplit -- SPLITTING THEM INTO SEPARATE FILES, THEN GIVING ## THE INDIVIDUAL FILES TO THE PAGER. ## # ASSUMES THAT YOU'RE USING AN mhl FORMAT FILE THAT PUTS # >>> foldername:msgnum # AT THE START OF EVERY MESSAGE. # # NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE # # USE AT YOUR OWN RISK. SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY! # PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com pager=${PAGER-less} # PROGRAM FOR PAGING THRU MESSAGES (DEFAULT IS "less") # START SEPARATOR LINE LIKE THE ONE mhl SHOULD OUTPUT ($mhfolder IS FOLDER NAME) sep=">>> ${mhfolder?}:" # SET PREFIX (LIKE msg12345-01, msg12345-02) FOR FILES csplit MAKES IN /tmp: msgs=msg$$- temp=/tmp/SHOWMULT$$ umask 077 # MAKE ALL TEMP FILES PRIVATE trap 'rm -f $temp ${msgs}*; exit' 0 1 2 15 cat > $temp # READ TEXT FROM mhl ON OUR STANDARD INPUT # NUMBER OF SEPARATORS IN THE FILE = NUMBER OF MESSAGES. numseps="`egrep -c \"^$sep\" $temp`" case $? in 2) echo "`basename $0` quitting: egrep bombed." 1>&2 exit ;; esac case "$numseps" in 0) $pager $temp ;; # NO SEPARATOR IF LESS THAN 2 MESSAGES 1) # ONE SEPARATOR??? SHOW MESSAGE(S), THEN COMPLAIN: $pager $temp echo "`basename $0`: warning: wild message separator? Couldn't split that." 1>&2 ;; [2-9]|[1-9][0-9]) # BETWEEN 2 AND 99 MESSAGES. SHOW THEM. # FIRST, GET REPETITION NUMBER FOR csplit: repeats="`expr $numseps - 1`" cd /tmp # IF $sep HAS A "/" IN IT, ADD BACKSLASH(ES) TO KEEP csplit FROM PUKING: case "$sep" in */*) sep="`echo \"$sep\" | sed 's@/@\\\\/@g'`" ;; esac if csplit -s -f $msgs $temp "/^$sep/" "{$repeats}" then rm -f ${msgs}00 # FIRST FILE IS ALWAYS EMPTY, SIGH $pager ${msgs}* else echo "`basename $0`: quitting: problem with 'csplit'?" 1>&2 fi ;; [1-9]*) # csplit CAN'T HANDLE MORE THAN 100 MESSAGES AND WE CAN'T DO MORE THAN 99: echo "`basename $0`: sorry, can't handle more than 99 messages." 1>&2 ;; *) echo 1>&2 "`basename $0`: quitting: wild 'egrep -c' output?: $numseps" ;; esac exit # SHOULD REALLY SET A STATUS, I GUESS