[comp.sys.handhelds] hidden variable utility for HP48

blair@en.ecn.purdue.edu (Marc E Blair) (06/11/91)

Hello everyone! This program is designed so users
can enjoy the added feature of hidden variables without 
accidently causing "Try to recover memory?" errors. Here is a description of
what each program does:

NORMAL - restores a directory to its natural state, i.e. no
         hidden variables

HIDE   - takes an argument from level one, a variable name or list,
         and hides it. 

ALL    - returns a list of all variables, including the '' variable and
         others hidden behind it.

HIDEN  - returns a list of only hidden variables.

NULL   - creates '' on the stack 

SPACE  - creates ' ' on the stack (I use it to create directories with no
         name - I set up my home menu to have only a no-name directory,
         and then use my no-name directory as my home diectory. This way
         I can hide "personalized commands" and other variables (like PRTPAR) 
         since no variables may be hidden in the home directory
         (due to system use))

DELIT  - takes a list from level 2 and an object from level one and deletes
         that object in the list if it exists. Used by HIDE program 

KEYS   - redefines user keys for PURGE and CLVAR so one does not accidently
         delete a non-empty directory that looks empty.

DISCLAIMER: I am not repsonsible for memory problems that may result
from cosmic rays while you are using this program or anything else.

enjoy!
----------------------------------------------------------->8
%%HP: T(3)A(D)F(.);
DIR
  NORMAL
    \<<
      IF PATH {
HOME } \=/
      THEN NULL
PURGE
      END
    \>>
  HIDE
    \<<
      IF DUP TYPE 6
==
      THEN 1 \->LIST
      END \-> L
      \<< VARS L SIZE
1 SWAP
        FOR A L A
GET DELIT
        NEXT
        IF PATH {
HOME } \=/
        THEN 5 NULL
STO NULL 1 \->LIST +
ORDER
        ELSE DROP
"NOT ALLOWED AT HOME"
DOERR
        END
      \>>
    \>>
  ALL
    \<< VARS DUP SIZE
NULL RCL \-> S A
      \<< NULL
        IFERR PURGE
        THEN DROP
        ELSE A NULL
RCL
          IF SAME
NOT
          THEN VARS
A NULL STO SWAP
            IFERR
ORDER
            THEN
DROP
            END DUP
1 S SUB SWAP DUP
SIZE S 1 + SWAP SUB
NULL SWAP + +
          END
        END
      \>>
    \>>
  HIDEN
    \<< ALL DUP DUP
NULL POS
      IF DUP 0 \=/
      THEN 1 + SWAP
SIZE SUB
        IFERR NULL
RCL DROP
        THEN DROP {
}
        ELSE
          IF PATH {
HOME } \=/
          THEN NULL
SWAP +
          ELSE DROP
{ }
          END
        END
      ELSE 3 DROPN
{ }
      END
    \>>
  NULL
    \<< "" # 5B15h
SYSEVAL
    \>>
  SPACE
    \<< " " # 5B15h
SYSEVAL
    \>>
  DELIT
    \<< OVER SIZE \-> S
      \<< DUP2 POS \->
A
        \<<
          IF A 0 \=/
          THEN
            IF S 1
==
            THEN
DROP2 { }
            ELSE
              IF A
1 ==
              THEN
SWAP 2 S SUB SWAP
DROP
              ELSE
IF A S ==
THEN SWAP 1 S 1 -
SUB SWAP DROP
ELSE SWAP DUP 1 A 1
- SUB SWAP A 1 + S
SUB + SWAP DROP
END
              END
            END
          ELSE DROP
          END
        \>>
      \>>
    \>>
  KEYSTO
    \<< { S
      \<<
        IFERR { }
SWAP DUP
          IF TYPE 5
==
          THEN DUP
SIZE
          ELSE 1
\->LIST 1
          END 1
SWAP
          FOR A DUP
A GET RCL
            IF TYPE
15 ==
            THEN
              IF
DUP A GET RCL BYTES
SWAP DROP 6.5 ==
              THEN
1
              ELSE
0
              END
            ELSE 1
            END
            IF
            THEN
DUP A GET PURGE
            ELSE
DUP A GET ROT SWAP
+ SWAP
            END
          NEXT DROP
          IF DUP {
} \=/
          THEN \->STR
"
Non-empty directory"
+ DOERR
          ELSE DROP
          END
        THEN
          IF { } ==
          THEN
"Too Few Arguements"
          ELSE
DROP2
"Not Purgable"
          END DOERR
        END
      \>> 54.2
      \<<
        IF PATH {
HOME } \=/
        THEN ""
# 5B15h SYSEVAL
PURGE
        END VARS
"HIT PURGE" 1 DISP
1 FREEZE
      \>> 54.3 }
STOKEYS
    \>>
END
--------------8<----------

Marc Blair

blair@en.ecn.purdue.edu         "The HP48: But, can it cook?"

blair@en.ecn.purdue.edu (Marc E Blair) (06/12/91)

It seems you can't find all the bugs in a program until after you
post it! It turns out that the null variable must contain something different
for each directory in order for the program to work properly. So I just changed
5 NULL STO to PATH NULL STO. Here is the correct 'HIDE' program, and sorry for
the inconvenience.
-------------------->8
%%HP: T(3)A(D)F(.);
    \<<
      IF DUP TYPE 6
==
      THEN 1 \->LIST
      END \-> L
      \<< VARS L SIZE
1 SWAP
        FOR A L A
GET DELIT
        NEXT
        IF PATH {
HOME } \=/
        THEN PATH NULL
STO NULL 1 \->LIST +
ORDER
        ELSE DROP
"NOT ALLOWED AT HOME"
DOERR
        END
      \>>
    \>>
--------------------->8

blair@en.ecn.purdue.edu