Index  Referenz Richtlinien Bemerkungen 

Shell-Skripte

Hier sind ein paar kleine Shell-Skripte. Sie sollen die Entwicklungsarbeit etwas erleichtern. Wer will, kann den Quelltext ausschneiden und im eigenen bin/ Verzeichniss abspeichern.

mark

RCS bietet die Moeglichkeit, Versionen von Dateien mit einem Namen zu versehen. So kann etwa die Version 1.4 der Datei Objekt.cpp den Namen "BetaVersion_vom_200198" bekommen und die Version 1.10 den Namen "FertigeVersion_vom_040298". RCS kann spaeter jede beliebig alte Version wiederherstellen - es reicht, den entsprechenden Namen anzugeben.

Normallerweise moechte man alle Projektdateien mit demselben Namen versehen. Mark erledigt dies automatisch. Wird das Skript lediglich mit einem Namen aufgerufen (etwa: mark BetaVersion_vom200198), so sucht es im aktuellen Verzeichnis nach allen Dateien, die "nach C++ aussehen". Das sind: Makefile sowie alle Dateien mit der Endung .h .cpp .cc .cxx und .C. Fuer diese Dateien wird das entsprechende RCS-Kommando aufgerufen. Es ist aber auch moeglich, ausser dem Namen die Dateien explizit anzugeben. Dann wird das Kommando nur fuer diese Dateien aufgerufen.

#! /bin/sh
#
# Das Programm vereinfacht die Benutzung von RCS.
# Es ruft fuer einen gegebenen Namen und alle gegebenen
# Dateien das RCS-Kommando "rcs -nNAME: DATEI" auf.
# Werden keine Dateien angegeben, benutzt das
# Programm die Dateien im aktuellen Verzeichnis,
# die eine der Endungen: .h .cpp .cc .cxx oder
# .C haben sowie die Datei Makefile.
#
# Beispiel:
#
# mark BetaVersion_200198 *.h *.cpp *.html
#
# vermerkt eine Version aller *.h *.cpp und *.html
# Dateien unter dem Namen BetaVersion_200198.
#
# Siehe auch "recall".
#
prog=`basename $0`
# Optionen ueberpruefen.
case "$1" in
  ""|-h|--help) echo "usage: $prog label [ file ... ]" >&2
                exit 1 ;;
  -*)           echo "$prog: unbekannte Option $1" >&2
                echo "usage: $prog label [ file ... ]" >&2
                exit 1 ;;
esac
# Den Namen der Version merken.
label=$1
shift
# Fuer alle sonstigen Argumente rcs -nVERSION: ARGUMENT
# aufrufen; fehlen die Argumente, so werden Standardwerte
# verwendet.
if [ $# -eq 0 ]
then
  for a in Makefile *.h *.cpp *.cc *.cxx *.C
  do
    if [ -f $a ]
    then
      rcs -n${label}: $a
    fi
  done
else
  for a in $@
  do
    if [ -f $a ]
    then
      rcs -n${label}: $a
    fi
  done
fi
 

recall

recall hilft, eine frueher vermerkte Version der Projektdateien wiederherzustellen. Das Skript benoetigt als Parameter lediglich den Namen. Es sucht im Unterverzeichniss RCS/ des aktuellen Verzeichnisses nach Dateien, von denen eine Version mit dem gegeben Namen existiert.

#! /bin/sh
# Das Programm vereinfacht die Benutzung von RCS.
# Es stellt eine frueher vermerkte Version der
# Projektdateien wiederher. Als Parameter benoetigt
# das Skript den Namen der Version.
#
# Beispiel:
#
# recall BetaVersion_200198
#
# Siehe auch "mark".
#
prog=`basename $0`
# Optionen ueberpruefen.
case "$1" in
  ""|-h|--help) echo "usage: $prog label" >&2
                exit 1 ;;
  -*)           echo "$prog: unbekannte Option $1" >&2
                echo "usage: $prog label" >&2
                exit 1 ;;
esac
# Den Namen der Version merken.
label=$1
shift
#
for a in ./RCS/*,v
do
  if [ -f $a ]
  then
    co -r${label} $a
  fi
done
 

undoc

Docpp verlangt leider die Plazierung aller Kommentare zu Klassenelementen und Elementfunktionen direkt vor ihrer Deklaration, also innerhalb der Klassendeklaration. Dadurch werden die Header-Dateien unlesbar. Kleine Abhilfe schaft (wenn man auf die automatische Dokumentation nicht verzichten will) dieses Skript. Es ist eine Art Filter, das anstelle eines gewoehnlichen Pagers, wie etwa 'more', eingesetzt wird. undoc blendet alle Kommentare sowie Leerzeilen aus, die sich innerhalb von Klassendeklarationen befinden.

#! /bin/sh
#
# Das Programm entfernt Kommentare, die sich innerhalb
# von Klassendeklarationen befinden. Es kann benutzt
# werden, um die docpp-Kommentare in den Header-Dateien
# von aulib++ "auszublenden".
#
# Es werden folgende Zeilen entfernt:
# 1.) beliebig viele Leerzeichen, danach //
# 2.) beliebig viele Leerzeichen, danach /* und alle
#     folgenden Zeilen einschliesslich der
#     Zeile mit */.
#     VORSICHT:
#     /* Kommentar */ i = a + b; wird entfernt!!!
# 3.) Leerzeilen
#
# Als Anfang einer Klassendeklaration gilt:
#   Zeilenanfang + class + irgendetwas + {
# Als Ende der Deklaration gilt:
#   Zeilenanfang + };
#
prog=`basename $0`
if [ $# -lt 1 ]
then
  echo "usage: $prog file ..." >&2
  exit 0
fi
awk 'BEGIN { a = 0; x = 0; c = 0 } # Flags initialisieren
     /^$/ { x = 1 }                # Leerzeile gefunden
     /^ *\/\// { x = 1 }           # // Kommentar gefunden
     /^ *\/\*/ { c = 1 }           # /* Kommentar gefunden
     { if ((a == 0) || ((c == 0) && (x == 0))) {
         print
       }
       else {
         x = 0
       }
     }
     /\*\// { c = 0 }              # */ gefunden
     /^class.*{/ { a = 1 }         # Klassendeklaration
     /^};/ { a = 0 }               # Ende der Deklaration' "$@" | more
 



Last modified: $Id: makefile.htm,v 1.1 1998/02/06 09:51:23 tomczyk Exp tomczyk $