Das folgende Beispielprogramm benutzt nur die IEDTCMD
-Schnittstelle.
/********************************************************************/ /* */ /* Beispiel 1 */ /* */ /* Dieses Beispiel verwendet ausschliesslich die IEDTCMD- */ /* Schnittstelle zur Ausfuehrung von EDT-Anweisungen. */ /* */ /* Das Beispielprogramm fuehrt folgende Aktionen durch: */ /* */ /* 1) Einlesen eines Auswahlkriteriums (CCSN) */ /* 2) Ausgabe eines Inhaltsverzeichnisses in die Arbeitsdatei 0 */ /* mit der @SHOW-Anweisung (Format 1). */ /* 3) Loeschen aller Zeilen, die nicht das Auswahlkriterium */ /* enthalten mit der @ON-Anweisung (Format 10). */ /* 4) Einstellen der Arbeitsdatei 0 und anschliessender Wechsel */ /* in den F-Modus-Dialog mit einer @SETF- und einer nach- */ /* folgenden @DIALOG-Anweisung. */ /* 5) Der Anwender kann nun die ausgegebenen Zeilen editieren */ /* und schliesslich den EDT und damit auch dieses Beispiel- */ /* programm beenden. */ /* */ /********************************************************************/ #include <string.h> #include <stdlib.h> #include <stdio.h> /* Include-Dateien der EDT-Unterprogrammschnittstelle */ #define EDT_V17 /*-------------------------- (1) */ #include <iedtgle.h> /*--------------------------- (2) */ /* Anlegen und Initialisieren der fuer dieses Beispiel benoetigten */ /* Datenstrukturen der EDT-Unterprogrammschnittstelle. */
static iedglcb glcb = IEDGLCB_INIT; static iedupcb upcb = IEDUPCB_INIT; static iedbuff *command = NULL; static iedbuff *message1 = NULL; static iedbuff *message2 = NULL; /********************************************************************/ /* Funktion: printrc */ /* */ /* Aufgabe: */ /* Falls der EDT eine Fehlermeldung zurueckgegeben hat, wird die */ /* Fehlermeldung durch diese Funktion ausgegeben. */ /* */ /* Parameter: errmsg (IN) Zeiger auf die im Fehlerfall */ /* zusaetzlich auszugebende Fehlermeldung */ /* */ /* Rueckgabewert: keiner */ /********************************************************************/ static void printrc(char *errmsg) { char message[81]; if ((glcb.rc.structured_rc.mc.maincode != 0) && (glcb.return_message.structured_msg.rmsgl > 0)) { printf("%s\n",errmsg); /* Uebergebene Fehlermeldung ausgeben */ strncpy(message,(char*)glcb.return_message.structured_msg.rmsgf, glcb.return_message.structured_msg.rmsgl); message[glcb.return_message.structured_msg.rmsgl] = 0x00; printf("Meldungstext: %s\n",message); /* EDT-Meldung ausgeben */ exit(1); } }
/********************************************************************/ /* Funktion: fill_buff */ /* */ /* Aufgabe: */ /* Diese Funktion versorgt einen Satz variabler Laenge (DVS-Format) */ /* mit einem Inhalt sowie das Satzlaengenfeld. */ /* */ /* Parameter: p: (IN) Zeiger auf eine Struktur vom Typ */ /* iedbuff, die den zu versorgenden Satz */ /* variabler Laenge enthaelt. */ /* textp: (IN) Zeiger auf einen String, der den ein- */ /* zutragenden Text enthaelt. Die Laenge */ /* des Strings legt implizit die Laenge */ /* des Satzes fest (Laenge String + 4). */ /* */ /* Rueckgabewert: keiner */ /********************************************************************/ static void fill_buff(iedbuff *p,char *textp) { size_t l_text; /* Laenge des String */ if ((l_text = strlen(textp)) > 2044) /*---------- (3) */ l_text = 2044; /* Laenge auf 2044 Zeichen begrenzen */ strncpy((char *)p->text,textp,l_text); /* Text eintragen */ p->length = l_text + 4; /* Satzlaenge versorgen */ } /********************************************************************/ /* Funktion: edtcmd */ /* */ /* Aufgabe: */ /* Diese Funktion traegt die uebergegebenen Strings in Saetze */ /* variabler Laenge ein (DVS-Format) und ruft anschliessend die */ /* CMD-Schnittstelle des EDT auf. */ /* */ /* Parameter: cmd: (IN) Zeiger auf einen String, der die */ /* auszufuehrenden EDT-Anweisung(en) */ /* enthaelt. Die Laenge des Strings legt */ /* implizit die Laenge des Satze fest */ /* (Laenge String + 4). */ /* msg1: (IN) Zeiger auf einen String, der den ein- */ /* zutragenden Text enthaelt. Die Laenge */ /* des Strings legt implizit die Laenge */ /* des Satzes fest (Laenge String + 4). */ /* msg2: (IN) Zeiger auf einen String, der den ein- */ /* zutragenden Text enthaelt. Die Laenge */ /* des Strings legt implizit die Laenge */ /* des Satzes fest (Laenge String + 4). */
/* */ /* Rueckgabewert: keiner */ /********************************************************************/ static void edtcmd(char *cmd,char *msg1,char *msg2) { fill_buff(command,cmd); fill_buff(message1,msg1); fill_buff(message2,msg2); IEDTCMD(&glcb,&upcb,command,message1,message2); } /********************************************************************/ /* Hauptprogramm */ /********************************************************************/ int main(void) { char input[81]; /* Eingabebereich */ char ccsn[9]; /* eingegebener CCSN */ char cmd[257]; /* Bereich zum Aufbau von EDT-Anweisungen */ /* buffer bereitstellen */ command = (iedbuff *)malloc(2048); message1 = (iedbuff *)malloc(2048); message2 = (iedbuff *)malloc(2048); printf("\nStart Beispiel1\n\n"); /* CCSN einlesen */ printf("Bitte CCSN eingeben (UTFE,UTF16,EDFxxx): "); scanf("%s",input); if (strlen(input) < 1 || strlen(input) > 8) { printf("Eingabe zu kurz oder zu lang!"); exit(1); } strupper(ccsn,input); /* CCSN in Grossbuchst. konv. */ /* Inhaltsverzeichnis in die Arbeitsdatei 0 ausgeben */ edtcmd("SHOW F=* TO 1 LONG","",""); printrc("Fehler bei der @SHOW-Anweisung!"); /* Alle Zeilen loeschen, die nicht dem Suchkriterium (CCSN) */ /* entsprechen und die verbliebenen Zeilen neu durchnummerieren */
sprintf(cmd,"ON &:100-107: FIND NOT '%s' DELETE;RENUMBER",ccsn); edtcmd(cmd,"",""); printrc("Fehler bei der @ON- oder der @RENUMBER-Anweisung!"); /* In die Arbeitsdatei 0 wechseln und in den */ /* F-Modus-Dialog umschalten */ edtcmd("SETF(0);DIALOG","Beispiel 1 fuer die UP-Schnittstelle",""); printrc("Fehler bei der @SETF- oder der @DIALOG-Anweisung!"); edtcmd("HALT","",""); printf("\nEnde Beispiel1\n\n"); return 0; }
Erläuterungen
(1) | Durch das #define wird gesteuert, dass die V17-Variante der Schnittstellen generiert wird. Damit wird der EDT dann auch automatisch im Unicode-Modus gestartet. |
(2) | Mit EDT V17.0 genügt eine #include Anweisung auf iedtgle.h. Dieses Header-File zieht die weiteren benötigten Header nach. |
(3) | Die Begrenzung auf 2044 ist in diesem Programm durch den malloc für die Pufferbereiche bestimmt. Der EDT selbst verkraftet 32767 Byte. |
Wenn die in Abschnitt Produktion von Hauptprogrammen in C erklärte Prozedur im BS2000 in einer Datei namens CC.DO
und die Quelldatei als S-Element BEISPIEL1.C
in der Bibliothek EDT.BEISPIELE
abgelegt ist, kann das obige Programm mit
/CALL-PROC CC.DO,(1)
übersetzt und gebunden werden. Das erzeugte Programm ist anschließend mit
/START-EXECUTABLE-PROGRAM (E=BSP1C,L=EDT.BEISPIELE)
ausführbar. Bei Ablauf von CC.DO
werden etwa folgende Ausgaben vom System bzw. vom Compiler erzeugt:
% BLS0523 ELEMENT 'SDFCC', VERSION '031', TYPE 'L' FROM LIBRARY ':MARS:$TSOS.SYSLNK.CPP-RS.031' IN PROCESS % BLS0524 LLM 'SDFCC', VERSION '03.1A40' OF '2005-02-03 16:16:36' LOADED % BLS0551 COPYRIGHT (C) Fujitsu Siemens Computers GmbH 2005. ALL RIGHTS RESERVED % CDR9992 : BEGIN C/C++(BS2000/OSD) VERSION 03.1A40 % CDR9907 : NOTES: 0 WARNINGS: 0 ERRORS: 0 FATALS: 0 % CDR9937 : MODULES GENERATED, CPU TIME USED = 2.4800 SEC % BND3102 SOME WEAK EXTERNS UNRESOLVED
% BND1501 LLM FORMAT: '1' % BND1101 BINDER NORMALLY TERMINATED. SEVERITY CLASS: 'UNRESOLVED EXTERNAL' % CDR9936 : END; SUMMARY: NOTES: 0 WARNINGS: 0 ERRORS: 0 FATALS: 0 % CCM0998 CPU TIME USED: 3.4223 SECONDS
Nach Aufruf von /START-EXECUTABLE-PROGRAM (E=BSP1C,L=EDT.BEISPIELE)
erscheinen etwa folgende Meldungen:
% BLS0523 ELEMENT 'BSP1C', VERSION '@', TYPE 'L' FROM LIBRARY ':A:$USER.EDT.BEISPIELE' IN PROCESS % BLS0524 LLM '$LIB-ELEM$EDT$BEISPIELE$$BSP1C$$',VERSION' 'OF'2007-05-03 14 :42:12' LOADED Start Beispiel1 Bitte CCSN eingeben (UTFE, UTF16, EDFxxx):
Gibt man hier UTF
ein, d.h. wählt alle Dateien aus, die in einem Unicode-Zeichensatz codiert sind, wechselt das Programm anschließend in den EDT-Dialog und es erscheint folgender Bildschirm:
Durch Eingabe von @INDEX OFF; @DELETE&:1-24: beschränkt man die Ausgabe auf die relevante Information und erhält folgendes Bild: