3
# wm-oldmenu2new: script to convert from old-style WindowMaker
4
# menu file to the new PropertyList style of the WMRootMenu.
6
# Note: ex in all the Linux systems I've used is badly
7
# broken, except for nex. perl can be relied on however.
8
# Re-written to use perl.
13
# Authors: Luke Kendall, Toby J Sargeant
15
# Copyright waived; no warranty provided.
18
GLW=GNUstep/Library/WindowMaker
24
USAGE="usage: $MYNAME [menu-file-specifier]
27
The default menu if no arguments are given is the English one, 'menu'."
30
# Process arguments - work out which language menu we're converting.
31
# Note that foreign language locales do *not* have the .lang suffix
32
# attached to the WMRootMenu name.
38
if [ -s "$WLW/menu.$1" ]
45
x=`expr "$1" : "menu\.\(.*\)"`
46
[ "x$x" != "x" ] && NEW_MENU="WMRootMenu"
48
echo "$MYNAME: $WLW/$1 does not exist" >&2
58
# For working out what cc is installed
63
PATH=/bin:/usr/bin:/usr/local/bin
68
test -x $j/$1 && test ! -d $j/$1 && echo $j/$1 && return 0
75
# Expand macros if necessary.
76
# Create a temp copy of the menu file to edit to turn into the new.
79
echo "Converting $GLW/$OLD_MENU --> $GD/$NEW_MENU"
81
if [ ! -s "$OLD_MENU" ]
83
echo "$MYNAME: $WLW/$OLD_MENU does not exist" >&2
87
# Always pre-process, to join lines split with \, and to strip comments.
88
# Not to mention the main purpose, include & process wmmacros if used.
92
[ "x$CC" = "x" ] && CC=`which1 gcc`
93
[ "x$CC" = "x" ] && "$MYNAME: no cc, gcc found - can't preprocess" >&2 && exit 1
96
# Use the "parse as if it's C option" if cc is gcc, because
97
# newer versions apparently get confused. Apparently gcc -E does
98
# not simply run the preprocessor (that's sad).
100
strings "$CC" | grep -l gcc > /dev/null && GCC_FLAGS="-x c"
104
# Given the set -e, the exit 1 shouldn't be needed. But it is, on my NeXT!
106
$CC -E -I. $GCC_FLAGS $T-c > $T+c || exit 1
107
sed '/^#/d;/^[ ]*$/d' $T+c > $T
112
# This is the interesting bit. Edit the old style menu and
113
# convert into new style property-list menu.
115
perl - $T <<-'EOF' > $T-p
122
s/^(\s*)"*(Workspaces*)"*\s\s*(WORKSPACE_MENU)/\1(\2, \3),/;
123
s/^(\s*)("[^"]*")\s+MENU/\1($v\n\1\2,/;
124
push @foo2,split "\n";
128
s/^(\s*)"([^"]*)"\s\s*END/\1),/;
129
s/^(\s*)"([^"]*)"\s\s*EXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1EXEC,$v\n\1"\3"$v\n\1),/;
130
push @foo,split "\n";
135
s/^(\s*)"([^"]*)"\s\s*OPEN_MENU\s\s*(.*)$/\1($v\n\1"\2",$v\n\1OPEN_MENU,$v\n\1"\3"$v\n\1),/;
136
push @foo2,split "\n";
140
s/^(\s*)([^ ]*)\s\s*MENU/\1($v\n\1"\2",/;
141
push @foo,split "\n";
145
s/^(\s*)([^ ]*)\s\s*END/\1),/;
146
s/^(\s*)([^ ]*)\s\s*EXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1EXEC,$v\n\1"\3"$v\n\1),/;
147
push @foo2,split "\n";
152
]*)\s\s*OPEN_MENU\s\s*(.*)$/\1($v\n\1"\2",$v\n\1OPEN_MENU,$v\n\1"\3"$v\n\1),/;
153
push @foo,split "\n";
157
s/ WITH / QQQjjQQQ /;
158
s/^(\s*)"([^"]*)"\s\s*([A-Z_][A-Z_]*)$/\1("\2", \3),/;
159
s/^(\s*)"([^"]*)"\s+([A-Z_][A-Z_]*)\s\s*(.*)$/\1("\2", \3, \4),/;
160
s/"(.*".*)"/JJJqqJJJ\1JJJqqJJJ/;
161
/JJJqqJJJ/ && s/"/\\"/g;
163
s/ QQQjjQQQ / WITH /;
170
# Now strip off spurious commas from lines like:
173
# since comma is a property separator, not terminator. Sigh.
174
# Also correct for another problem - Linux ex's require the CTRL-V
175
# above; a real vi/ex doesn't; so we have to strip out any spurious
176
# CTRL-V characters if we're using a real ex:
178
sed 's///g' $T | awk '
180
if (last_line != null)
182
if ((last_line ~ /,$/) && ($0 ~ /^[ ]*\)/))
183
print substr(last_line, 0, length(last_line)-1)
191
if (last_line != null)
193
if (last_line ~ /,$/)
194
print substr(last_line, 0, length(last_line)-1)
199
' > $WD/$NEW_MENU.new || exit 1
209
echo "Preserving $NEW_MENU as $NEW_MENU.sav in $WD"
210
mv $NEW_MENU $NEW_MENU.sav
212
mv $NEW_MENU.new $NEW_MENU && echo "Created new $WD/$NEW_MENU"