Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Beispiel 1 - C-Hauptprogramm

&pagelevel(3)&pagelevel

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: