Benutzer-Werkzeuge

Webseiten-Werkzeuge


edv:prg:c:example:vorlage_c-programm

Vorlage C-Programm

Ein Gerüst für ein C-Programm

AppName.h:

/**********************************************************************
*
*	$AppName:		Application		%
*	$FileName:		AppName.h		%
*	$Description:
*	$CreatedBy:		Name			%
*	$CreatedDate:		2000-01-01_00:00	%
*	$LastModifyBy:		Name			%
*	$LastModifyDate:	2000-01-01_00:00	%
*
**********************************************************************/
 
/* History ************************************************************
*
* 2000-01-01 User1234: XY wurde durch XZ ersetzt.
*
**********************************************************************/
 
#ifndef _AppName_h_H
#define _AppName_h_H
 
 
// ******************** #include ****************************************
#include <stdio.h>	// "stdout", NULL
 
 
// ******************** defines ****************************************
 
// Konstanten bzw. Makros (global - für die gesamte Anwendung)
#define PROGRAM_NAME	"AppName"
#define PROGRAM_VERSION	"01.01.01"
#define PROGRAM_STAND	"31.12.2000"
 
#define TRACEDIR_DEFAULT	"/trace"
 
// ExitCodes
#define EC_OK			0
#define EC_FALSCHE_PARAMETER	-1
#define EC_FALSCHE_ENVIRONMENT	-2
 
// RC-Codes
#define RC_OK	0
#define RC_ERR	-1
 
// DB
#define RC_DB_OK		0
#define RC_DB_NOTFOUND	100
#define RC_DB_ERR		-1
#define TRANSACTION_COMMIT	1
#define TRANSACTION_ROLLBACK	2
#define TRANSACTION_OFF	0
#define TRANSACTION_ON	1
 
// Umgebungsvariablen
#define ENV_USER		"USER"
#define ENV_TRACEPATH		"TRACEPATH"
#define ENV_HOSTNAME		"HOSTNAME"
#define ENV_MAIL_ABSENDER	"MAIL_ABSENDER"
#define ENV_SHELL		"SHELL"
 
// verschiedene Konstanten
#define TMP_STR_LEN_MAX	8191
#define TMP_STR_LEN_MAX_STR	"8191"
#define FILENAME_LEN_MAX	8191
 
 
// ******************** Strukturen ****************************************
 
// ******************** globale Variablen ****************************************
 
int logLevel	= 0;
int logFileID	= 0;
 
char pfadTrace [FILENAME_LEN_MAX + 1]; // Pfad zum Trace-Verzeichnis
 
// Environment
char *envHostname	= NULL; // Der aktuelle Hostname
char *envTracePatch	= NULL; // trace-Verzeichnis
char *envEMailAbsender	= NULL; // Dieser User soll als eMail-Absender dienen
char *envUser		= NULL; // $USER
char *envShell		= NULL; // Aktuelle SHELL
 
// Beispielsvariablen
int modusParameterA	= 0;
int modusTestlauf	= 0;
int anzahlIrgendwas	= 0;
 
 
// Statistik:
 
/* Everything else goes here */
 
#endif
 
// EOF

AppName.c:

/**********************************************************************
*
*	$AppName:		Application		%
*	$FileName:		AppName.c		%
*	$Description:
*	$CreatedBy:		Name			%
*	$CreatedDate:		2000-01-01_00:00	%
*	$LastModifyBy:		Name			%
*	$LastModifyDate:	2000-01-01_00:00	%
*
**********************************************************************/
 
 
/* History ************************************************************
*
* 2000-01-01 User1234: XY wurde durch XZ ersetzt.
*
**********************************************************************/
 
 
// ******************** #include **************************************
#include "AppName.h"
 
 
// ******************** #define ***************************************
//#define DEBUGMODE
 
#define MODUL_NAME	"AppName.c"
 
 
// ******************** Global Variables ******************************
char * modulName = MODUL_NAME;
 
 
// ******************** exit-Function *********************************
 
// ******************** Signal-Handling *******************************
 
// ******************** Functions *************************************
 
void printAbout () // Kurze Info über die Anwendung (über stderr) ausgeben.
{
} // printAbout()
 
 
void printDescription () // Syntax (über stderr) ausgeben.
{
} // printDescription()
 
 
void initGlobalVar () // Globale Variablen initialisieren (für die gesamte Anwendung).
{
	logLevel  = LOGLEVEL_STD;
	logFileID = LOGFILE_NOFILE;
 
	memset(pfadTrace, '\0', sizeof(pfadTrace));
 
	// Environment
	envHostname		= NULL; // Der aktuelle Hostname
	envTracePatch		= NULL; // trace-Verzeichnis
	envEMailAbsender	= NULL; // Dieser User soll als eMail-Absender dienen
	envUser			= NULL; // $USER
	envShell		= NULL; // Aktuelle SHELL
 
	modusParameterA	= OFF;
	modusTestlauf		= OFF;
	anzahlIrgendwas	= 123;
} // initGlobalVar()
 
 
void initLocalVar () // Lokale Variablen initialisieren (nur für dieses Modul).
{
	char * functionName = "initLocalVar"; // Ein Beispiel
} // initLocalVar()
 
 
int initRuntimeVar (void) // Einige Variablen mit Laufzeitwerten initialisieren.
{
	int rc = RC_OK;
 
	// Environment übernehmen
	envHostname      = getenv(ENV_HOSTNAME);
	envTracePatch    = getenv(ENV_TRACEPATH);
	envEMailAbsender = getenv(ENV_MAIL_ABSENDER);
	envUser          = getenv(ENV_USER);
	envShell         = getenv(ENV_SHELL);
 
	// Den Namen des Trace-Verzeichnisses bilden
	if (envTracePatch) strlcpy(pfadTrace, envTracePatch, sizeof(pfadTrace)); // Allgemeiner Trace-Pfad
	else strlcpy(pfadTrace, TRACEDIR_DEFAULT, sizeof(pfadTrace)); // Default Trace-Pfad
 
	if (pfadTrace[strlen(pfadTrace)] != '/') strlcat(pfadTrace, "/", sizeof(pfadTrace)); // Falls '/'-Zeichen am Ende fehlt - hinzufügen
 
	strlcat(pfadTrace, PROGRAM_NAME, sizeof(pfadTrace)); // Programmname an den Pfad anhängen
 
	return rc;
} // initRuntimeVar()
 
 
int initLogging (void) // Initialisiert das Logging für die gesamte Anwendung.
{
	int rc = RC_OK;
 
	// Logging initialisieren
	logFileID = logInit(pfadTrace, PROGRAM_NAME, NULL, LOGSTATUS_RUN, LOGSTATUS_CLOSE, 0, logLevel);
	if (logFileID == LOGFILE_ERROR || logFileID == LOGFILE_NOFILE) rc = RC_ERR;
	else rc = logLog(LOG_DEBUG, logFileID, __FILE__, __LINE__, __func__, "Das LogFile wurde angelegt.");
 
	return rc;
} // initLogging()
 
int doneLogging (void) // Beendet das Logging für die gesamte Anwendung.
{
	int rc = RC_OK;
 
	rc = logLog(LOG_DEBUG, logFileID, __FILE__, __LINE__, __func__, "Das LogFile wird geschlossen.");
	logDone(logFileID);
	logFileID = LOGFILE_NOFILE;
 
	return rc;
} // doneLogging()
 
 
// Parameter von "Application" (Beispiel):
//	-a		: optionaler Parameter a
//	-l Zahl		: LogLevel, default 5 (LOG_NOTICE)
//	-t Anzahl	: Testlauf: es werden nur <Anzahl> von Irgendwas bearbeitet
int checkParameter (int argc, char *argv []) // Aufruf-Parameter auswerten.
{
	int rc = RC_OK;
	int param;
	register int i;
	char strParameter [TMP_STR_LEN_MAX + 1]; // Ausgabe der gesamten Parameter-Zeile vor dem Parsen
	char logStr       [TMP_STR_LEN_MAX + 1]; // u.a. Ausgabe der ermittelten Parameter nach dem Parsen
 
	memset(logStr, '\0', sizeof(logStr));
 
	strcpy(strParameter, "CALL:"); // Achtung! strcpy() ist unsicher!
	for (i = 0; i < argc; i++)
	{
		if ((strlen(strParameter) + 1 + strlen(argv[i])) > TMP_STR_LEN_MAX) logErrorMsgFatal(EC_FALSCHE_PARAMETER, __FILE__, __LINE__, __func__, "Parameterzeile zu lang. Es sind maximal " TMP_STR_LEN_MAX_STR " Zeichen zulässig.");
 
		strlcat(strParameter, " ", sizeof(strParameter));
		strlcat(strParameter, argv[i], sizeof(strParameter));
	} // for i
	logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, strParameter);
 
	while ((param = getopt(argc, argv, "al:t:")) != -1) // Parameter parsen
	{
		switch (param)
		{
			case 'a': modusParameterA = ON; break; // ON = Parameter a aktiv
			case 'l': logLevel = atoi(optarg); break; // LogLevel
			case 't': modusTestlauf = ON; anzahlIrgendwas = atoi(optarg); break;
 
			default: // falsche Parameter
				snprintf(logStr, sizeof(logStr), "Fehler: '-%c' - falscher Parameter\n", param);
				logLog(LOG_ERR, logFileID, __FILE__, __LINE__, __func__, logStr);
				rc = RC_ERR;
		} // switch (param)
	} // while
 
	// Environment-Übersicht ausgeben:
	logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, PROGRAM_NAME " wird mit folgendem Environment ausgeführt:");
	snprintf(logStr, sizeof(logStr), "%s: [%s]", ENV_HOSTNAME,      envHostname      ? envHostname      : "NULL"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "%s: [%s]", ENV_TRACEPATH,     envTracePatch    ? envTracePatch    : "NULL"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "%s: [%s]", ENV_MAIL_ABSENDER, envEMailAbsender ? envEMailAbsender : "NULL"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "%s: [%s]", ENV_USER,          envUser          ? envUser          : "NULL"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "%s: [%s]", ENV_SHELL,         envShell         ? envShell         : "NULL"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
 
	// Plausibilitätsprüfung:
	if ((logLevel < LOGLEVEL_MIN) || (logLevel > LOGLEVEL_MAX)) // Falscher LogLevel
	{
		snprintf(logStr, sizeof(logStr), "Falscher LogLevel [%i] als Parameter angegeben. Es dürfen nur Werte zwischen [%i] (LOG_EMERG) und [%i] (LOG_DEBUG) genutzt werden.\n", logLevel, LOGLEVEL_MIN, LOGLEVEL_MAX);
		logLog(LOG_ERR, logFileID, __FILE__, __LINE__, __func__, logStr);
		logLevel = LOGLEVEL_STD;
		snprintf(logStr, sizeof(logStr), "Es wird default-LogLevel [%i] genutzt.\n", logLevel);
		logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	} // if
	if (!envHostname || !envEMailAbsender || !envTracePatch)
	{
		rc = RC_ERR;
		snprintf(logStr, sizeof(logStr), "Nicht alle Umgebungsvariablen definiert. Folgende sind erforderlich: [%s], [%s] und [%s]\n", ENV_HOSTNAME, ENV_MAIL_ABSENDER, ENV_TRACEPATH);
		logErrorMsgFatal(EC_FALSCHE_ENVIRONMENT, __FILE__, __LINE__, __func__, logStr);
	} // if
 
	// Parameteruebersicht ausgeben:
	logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, PROGRAM_NAME " wird mit folgenden Parameter ausgeführt:");
	snprintf(logStr, sizeof(logStr), "Log-Level:   [%i]", logLevel); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "Trace-Pfad:  [%s]", pfadTrace); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "Parameter a: [%s]", modusParameterA ? "a aktiv" : "a inaktiv"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	snprintf(logStr, sizeof(logStr), "TestLauf:    [%s]", modusTestlauf ? "EIN" : "AUS"); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	if (modusTestlauf)
	{
		snprintf(logStr, sizeof(logStr), "Anzahl von Irgendwas im TestLauf: [%i]", anzahlIrgendwas); logLog(LOG_NOTICE, logFileID, __FILE__, __LINE__, __func__, logStr);
	} // if
 
	return rc;
} // checkParameter()
 
 
int app_Init (int maxAttempt, int timeOut) // Die gesamte Anwendung initialisieren.
{
	int rc = RC_OK;
 
	rc = init_Part_1(maxAttempt, timeOut); // Funktionalität 1 initialisieren.
	rc = init_Part_2(maxAttempt, timeOut); // Funktionalität 2 initialisieren.
	rc = init_Part_3(maxAttempt, timeOut); // Funktionalität 3 initialisieren.
 
	return rc;
} // app_Init()
 
 
int app_Done (int rc_Init, int rc_Run) // Die gesamte Anwendung deinitialisieren.
{
	int rc = RC_OK;
 
	rc = done_Part_3(); // Funktionalität 3 deinitialisieren.
	rc = done_Part_2(); // Funktionalität 2 deinitialisieren.
	rc = done_Part_1(); // Funktionalität 1 deinitialisieren.
 
	return rc;
} // app_Done()
 
 
int re_Init (int partName, int maxAttempt, int timeOut) // Bei temporären Problemen.
// z.B. DB-Connect verloren, die Session neu initialisieren.
{
	int rc = RC_OK;
 
	switch (partName)
	{
		case Part_1:
			rc = done_Part_1(); // Funktionalität 1 deinitialisieren.
			rc = init_Part_1(maxAttempt, timeOut); // Funktionalität 1 initialisieren.
			break;
		case Part_2:
			rc = done_Part_2(); // Funktionalität 2 deinitialisieren.
			rc = init_Part_2(maxAttempt, timeOut); // Funktionalität 2 initialisieren.
			break;
		case Part_3:
			rc = done_Part_3(); // Funktionalität 3 deinitialisieren.
			rc = init_Part_3(maxAttempt, timeOut); // Funktionalität 3 initialisieren.
			break;
		default:
			rc = RC_ERR; // Interner Fehler
	} // switch
 
	return rc;
} // re_Init()
 
 
int app_Run (int rc_Init) // Der Hauptteil der Anwendung.
{
	int rc = RC_OK;
 
	switch (...)
	{
		case part1:
			rc = run_Part_1_1(); // Funktionalität 1.1 ausführen.
			rc = run_Part_1_2(); // Funktionalität 1.2 ausführen.
			break;
		case part2:
			rc = run_Part_2_1(); // Funktionalität 2.1 ausführen.
			rc = run_Part_2_2(); // Funktionalität 2.2 ausführen.
			rc = run_Part_2_3(); // Funktionalität 2.3 ausführen.
			break;
		case part3:
			rc = run_Part_3(); // Funktionalität 3 ausführen.
			break;
		default:
			rc = RC_ERR; // Interner Fehler.
	} // switch
 
	return rc;
} // app_Run()
 
 
// ******************** main() ****************************************
 
int main (int argc, char *argv [])
{
	int rc		= RC_OK;
	int rc_init	= RC_OK;
	int rc_run	= RC_OK;
	int rc_done	= RC_OK;
	int maxAttempt	= 0;
	int timeOut	= 0;
 
#ifdef DEBUGMODE
	fprintf(stderr, "\n=== DEBUGMODE is ON ===\n");
#endif
 
	initGlobalVar();
	initLocalVar();
	rc = initRuntimeVar();
	rc = initLogging();
 
	rc = checkParameter(argc, argv);
 
	if (!rc) // Falls die Vorbereitung erfolgreich war...
	{
		rc_init = app_Init(maxAttempt, timeOut); // Initialisierung.
		rc_run  = app_Run(rc_init); // Hauptlauf.
		rc_done = app_Done(rc_init, rc_run); // Aufräumen.
	} // if
 
	rc = doneLogging();
 
	if ((rc_init) || (rc_run) || (rc_done)) rc = RC_ERR;
	return rc;
} // main()
 
// EOF

Stand: 04.11.2010 — : Jürgen Kreick

EOF

edv/prg/c/example/vorlage_c-programm.txt · Zuletzt geändert: 2020/01/11 01:23 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki