cdesktopenv/cde/programs/util/scripts/convertvf

268 lines
5.8 KiB
Bash

#! /bin/ksh
##############################################################################
#
# convertVf
#
# This shell script converts the VUE 3.0 filetypes database files (*.vf)
# to the CDE 1.0 datatypes database files (*.dt). This script is a
# filter, this allows the user to select the input and output file names.
# To be recognized as a CDE 1.0 desktop datatypes file the output file
# name must be of the form: "*.dt"
#
# The transformations applied to the input are:
# 1) change a number of strings;
# 2) enclose type/action definitions in brackets;
# 3) remove "END" lines;
# 4) break up FILETYPES definitions into DATA_CRITERIA and
# DATA_ATTRIBUTES definitions.
# 5) escape special characters which appear in NAME_PATTERNS
# (PATH_PATTERNS) with a backslash. (e.g. '!')
# 6) Replace LARGE and SMALL ICON references with a single ICON
# reference, while possibly removing size-related suffixes from
# the icon name string. (e.g foo.l --> foo )
# 7) Convert TYPE MAP <action> lines to
# TYPE MAP
# MAP_ACTION <action>
#
# Usage: convertvf < file.vf > file.dt
#
##############################################################################
typeset USAGE="Usage: $(basename $0) < file.vf > file.dt"
###############################################################################
#
# changeStrings()
# This function invokes sed to search and replace a number of
# strings which have been changed between the Vue3.0 ".vf"
# files and the CDE 1.0 ".dt" files.
#
###############################################################################
changeStrings() {
# NOTE:
# LARGE_ICON definitions are retained and converted to their ICON equivalents
# SMALL_ICON definitions are discarded.
#
sed '
s/Filetype/DataType/g
s/filetype/DataType/g
s/%FileName%/%name%/g
s/%PathName%/%dir%/g
s/PATH-PATTERN/PATH_PATTERN/
s/FILETYPE/DATA_CRITERIA/
s/FILE-PATTERN/NAME_PATTERN/
s/ARG-TYPES/ARG_TYPE/
s/ARG-COUNT/ARG_COUNT/
s/WINDOW-TYPE/WINDOW_TYPE/
s/EXEC-STRING/EXEC_STRING/
s/EXEC-HOST/EXEC_HOST/
s/NO-STDIO/NO_STDIO/
s/PERM-TERMINAL/PERM_TERMINAL/
s/SHELL-TERMINAL/SHELL_TERMINAL/
s/OUTPUT-ONLY/PERM_TERMINAL/
s/SHARED-OUTPUT/PERM_TERMINAL/
s/\([^_]\)ATTRIBUTES\([^_]\)/\1PROPERTIES\2/
s/RELOAD-TYPES-DB/RELOAD_TYPES_DB/
s/MSG-TOOL/DT_SVC/
s/MSG-COMMAND/DT_REQUEST_NAME/
s/L-ICON/ICON/
s/LARGE_ICON/ICON/
s/L-INSTANCE-ICON/INSTANCE_ICON/
s/LARGE_INSTANCE_ICON/INSTANCE_ICON/
s/MSG-DATA/DT_ARG0_VALUE/
/S-ICON/d
/SMALL_ICON/d
/S-INSTANCE-ICON/d
/SMALL_INSTANCE_ICON/d
/^[ ]*set[ ]/s/\(.*\)\.[lms]\.bm/\1/
/ICON/s/\(.*\)\.[lms]\.bm/\1/
' $*
}
###############################################################################
#
# replaceFileTypes()
# This function invokes awk to replace FILETYPE definitions with
# DATA_CRITERIA and DATA_ATTRIBUTES definitions. It places brackets
# around the definitions, instead of using "END" to mark the end of
# a definition.
#
###############################################################################
replaceFileTypes() {
awk '
function printCrit( array )
{
if ( names[TypeName] )
print "DATA_CRITERIA", TypeName names[TypeName];
else
print "DATA_CRITERIA", TypeName
print "{"
print " DATA_ATTRIBUTES_NAME",TypeName
for (c in array) {
print array[c];
delete array[c];
}
print "}"
}
function printAtt( array )
{
print "DATA_ATTRIBUTES",TypeName;
print "{"
for (c in array) {
print array[c];
delete array[c];
}
print "}"
}
BEGIN {
criteria[1] = "NAME_PATTERN";
criteria[2] = "PATH_PATTERN";
criteria[3] = "CONTENT";
criteria[4] = "MODE";
criteria[5] = "LINK_PATH";
criteria[6] = "LINK_NAME";
criteria[7] = "DATA_ATTRIBUTES_NAME";
critMax = 7;
gettingLines = 0;
}
#
# Special treatment CRITERIA/ATTRIBUTE Fields
#
$1 == "NAME_PATTERN" {
#
# escape special syntax chars in name patterns
#
if ( $2 ~ /!/) {
gsub(/!/,"\\!")
}
}
$1 == "ICON" || $1 == "INSTANCE_ICON" {
if ( $2 ~ /.l/ ) {
sub(/\.l$/,"",$0);
}
}
$1 == "DATA_CRITERIA" {
TypeName = $2;
names[$2]++;
gettingLines = 1;
next;
}
#
# Special treatment ACTION FIELDS
#
$1 == "TYPE" && $2 == "MAP" && NF == 3 {
print " " $1 " " $2
print " MAP_ACTION " $3
next;
}
#
# TYPE MESSAGE actions were not publicly exposed so there should
# not be many message actions to translate. Here we make some
# assumptions about the message action.
#
# Only the ReloadActions broadcast message becomes a DT_NOTIFY message.
# Assume all other messages turn into DT_REQUESTs.
#
$1 == "TYPE" && $2 == "MESSAGE" {
if ( ActionName == "ReloadActions" )
print " TYPE DT_NOTIFY"
else
print " TYPE DT_REQUEST"
next;
}
$1 == "DT_REQUEST_NAME" && ActionName == "ReloadActions" {
print " DT_NOTIFY_NAME " $2
next
}
$1 == "ACTION" {
ActionName = $2
print $0
print "{"
next;
}
(($1 == "END") || ($1 == "}")) && gettingLines {
gettingLines = 0;
if ( names[TypeName] == 1 )
printAtt(newAtt);
printCrit(newCrit);
next;
}
$1 == "END" {
print "}"
next;
}
$1 == "{" {
# do not print any brackets -- we will
# supply any that are necessary
next;
}
gettingLines == 1 {
for ( i = 1; i <= critMax; i++ ) {
# compare to criteria strings
if ( $1 == criteria[i] ) {
tmp = $1;
newCrit[$1] = $0
while ( substr($0,length($0),1) == "\\" ) {
getline;
newCrit[tmp] = newCrit[tmp] "\n" $0;
}
next;
}
}
#
# If we have not found it yet it must be an
# attribute.
#
tmp = $1
newAtt[tmp] = $0;
while ( substr($0,length($0),1) == "\\" ) {
getline;
newAtt[tmp] = newAtt[tmp] "\n" $0;
}
next;
}
gettingLines == 0 { print $0 }
' $*
}
###############################################################################
[ $# -eq 0 ] || {
echo $USAGE;
exit 1;
}
changeStrings $i | replaceFileTypes