123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- #! /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
|