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.
78 TD
=$
(/bin
/mktemp
-d /tmp
/wmmenu.XXXXXX
) ||
{ echo "$0: can not create temporary file" >& 2; exit 1; }
81 echo "Converting $GLW/$OLD_MENU --> $GD/$NEW_MENU"
83 if [ ! -s "$OLD_MENU" ]
85 echo "$MYNAME: $WLW/$OLD_MENU does not exist" >&2
89 # Always pre-process, to join lines split with \, and to strip comments.
90 # Not to mention the main purpose, include & process wmmacros if used.
94 [ "x$CC" = "x" ] && CC
=`which1 gcc`
95 [ "x$CC" = "x" ] && "$MYNAME: no cc, gcc found - can't preprocess" >&2 && exit 1
98 # Use the "parse as if it's C option" if cc is gcc, because
99 # newer versions apparently get confused. Apparently gcc -E does
100 # not simply run the preprocessor (that's sad).
102 strings "$CC" |
grep -l gcc
> /dev
/null
&& GCC_FLAGS
="-x c"
106 # Given the set -e, the exit 1 shouldn't be needed. But it is, on my NeXT!
108 $CC -E -I.
$GCC_FLAGS $T-c > $T+c ||
exit 1
109 sed '/^#/d;/^[ ]*$/d' $T+c
> $T
114 # This is the interesting bit. Edit the old style menu and
115 # convert into new style property-list menu.
117 perl
- $T <<-'EOF' > $T-p
124 s/^(\s*)"*(Workspaces*)"*\s\s*(WORKSPACE_MENU)/\1(\2, \3),/;
125 s/^(\s*)("[^"]*")\s+MENU/\1($v\n\1\2,/;
126 push @foo2,split "\n";
130 s/^(\s*)"([^"]*)"\s\s*END/\1),/;
131 s/^(\s*)"([^"]*)"\s\s*EXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1EXEC,$v\n\1"\3"$v\n\1),/;
132 s/^(\s*)"([^"]*)"\s\s*SHEXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1SHEXEC,$v\n\1"\3"$v\n\1),/;
133 push @foo,split "\n";
138 s/^(\s*)"([^"]*)"\s\s*OPEN_MENU\s\s*(.*)$/\1($v\n\1"\2",$v\n\1OPEN_MENU,$v\n\1"\3"$v\n\1),/;
139 push @foo2,split "\n";
143 s/^(\s*)([^ ]*)\s\s*MENU/\1($v\n\1"\2",/;
144 push @foo,split "\n";
148 s/^(\s*)([^ ]*)\s\s*END/\1),/;
149 s/^(\s*)([^ ]*)\s\s*EXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1EXEC,$v\n\1"\3"$v\n\1),/;
150 s/^(\s*)([^ ]*)\s\s*SHEXEC\s\s*(.*)$/\1($v\n\1"\2",$v\n\1SHEXEC,$v\n\1"\3"$v\n\1),/;
151 push @foo2,split "\n";
156 ]*)\s\s*OPEN_MENU\s\s*(.*)$/\1($v\n\1"\2",$v\n\1OPEN_MENU,$v\n\1"\3"$v\n\1),/;
157 push @foo,split "\n";
161 s/ WITH / QQQjjQQQ /;
162 s/^(\s*)"([^"]*)"\s\s*([A-Z_][A-Z_]*)$/\1("\2", \3),/;
163 s/^(\s*)"([^"]*)"\s+([A-Z_][A-Z_]*)\s\s*(.*)$/\1("\2", \3, \4),/;
164 s/"(.*".*)"/JJJqqJJJ\1JJJqqJJJ/;
165 /JJJqqJJJ/ && s/"/\\"/g;
167 s/ QQQjjQQQ / WITH /;
174 # Now strip off spurious commas from lines like:
177 # since comma is a property separator, not terminator. Sigh.
178 # Also correct for another problem - Linux ex's require the CTRL-V
179 # above; a real vi/ex doesn't; so we have to strip out any spurious
180 # CTRL-V characters if we're using a real ex:
182 sed 's/\x16//g' $T |
awk '
184 if (last_line != null)
186 if ((last_line ~ /,$/) && ($0 ~ /^[ ]*\)/))
187 print substr(last_line, 0, length(last_line)-1)
195 if (last_line != null)
197 if (last_line ~ /,$/)
198 print substr(last_line, 0, length(last_line)-1)
203 ' > $WD/$NEW_MENU.new ||
exit 1
214 echo "Preserving $NEW_MENU as $NEW_MENU.sav in $WD"
215 mv $NEW_MENU $NEW_MENU.sav
217 mv $NEW_MENU.new
$NEW_MENU && echo "Created new $WD/$NEW_MENU"