This is Unofficial EPICS BASE Doxygen Site
errSymLib.c File Reference
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include "cantProceed.h"
#include "epicsAssert.h"
#include "epicsStdio.h"
#include "errMdef.h"
#include "errSymTbl.h"
#include "ellLib.h"
#include "errlog.h"
+ Include dependency graph for errSymLib.c:

Go to the source code of this file.

Classes

struct  errnumnode
 

Macros

#define NHASH   256
 

Typedefs

typedef struct errnumnode ERRNUMNODE
 

Functions

int errSymBld (void)
 
int errSymbolAdd (long errNum, const char *name)
 
const char * errSymMsg (long status)
 
void errSymLookup (long status, char *pBuf, size_t bufLength)
 
void errSymDump (void)
 
void errSymTestPrint (long errNum)
 
void errSymTest (epicsUInt16 modnum, epicsUInt16 begErrNum, epicsUInt16 endErrNum)
 

Variables

ERRSYMTAB_ID errSymTbl
 

Macro Definition Documentation

#define NHASH   256

Definition at line 30 of file errSymLib.c.

Typedef Documentation

typedef struct errnumnode ERRNUMNODE

Function Documentation

int errSymBld ( void  )

Definition at line 55 of file errSymLib.c.

56 {
57  ERRSYMBOL *errArray = errSymTbl->symbols;
58  ERRNUMNODE *perrNumNode = NULL;
59  ERRNUMNODE *pNextNode = NULL;
60  ERRNUMNODE **phashnode = NULL;
61  int i;
62  int modnum;
63 
64  if (initialized)
65  return(0);
66 
67  hashtable = (ERRNUMNODE**)callocMustSucceed
68  (NHASH, sizeof(ERRNUMNODE*),"errSymBld");
69  for (i = 0; i < errSymTbl->nsymbols; i++, errArray++) {
70  modnum = errArray->errNum >> 16;
71  if (modnum < 501) {
72  fprintf(stderr, "errSymBld: ERROR - Module number in errSymTbl < 501 was Module=%lx Name=%s\n",
73  errArray->errNum, errArray->name);
74  continue;
75  }
76  if ((errSymbolAdd(errArray->errNum, errArray->name)) < 0) {
77  fprintf(stderr, "errSymBld: ERROR - errSymbolAdd() failed \n");
78  continue;
79  }
80  }
81  perrNumNode = (ERRNUMNODE *) ellFirst(&errnumlist);
82  while (perrNumNode) {
83  /* hash each perrNumNode->errNum */
84  epicsUInt16 hashInd = errhash(perrNumNode->errNum);
85 
86  phashnode = (ERRNUMNODE**)&hashtable[hashInd];
87  pNextNode = (ERRNUMNODE*) *phashnode;
88  /* search for last node (NULL) of hashnode linked list */
89  while (pNextNode) {
90  phashnode = &pNextNode->hashnode;
91  pNextNode = *phashnode;
92  }
93  *phashnode = perrNumNode;
94  perrNumNode = (ERRNUMNODE *) ellNext((ELLNODE *) perrNumNode);
95  }
96  initialized = 1;
97  return(0);
98 }
int i
Definition: scan.c:967
unsigned short epicsUInt16
Definition: epicsTypes.h:41
ERRSYMTAB_ID errSymTbl
long errNum
Definition: errSymLib.c:36
#define NULL
Definition: catime.c:38
ERRSYMBOL * symbols
Definition: errSymTbl.h:27
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
long errNum
Definition: errSymTbl.h:20
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
List node type.
Definition: ellLib.h:45
const char * name
Definition: errSymTbl.h:21
int errSymbolAdd(long errNum, const char *name)
Definition: errSymLib.c:118
#define NHASH
Definition: errSymLib.c:30
#define stderr
Definition: epicsStdio.h:32
struct errnumnode * hashnode
Definition: errSymLib.c:37
int nsymbols
Definition: errSymTbl.h:26
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
int errSymbolAdd ( long  errNum,
const char *  name 
)

Definition at line 118 of file errSymLib.c.

119 {
121  sizeof(ERRNUMNODE), "errSymbolAdd");
122 
123  pNew->errNum = errNum;
124  pNew->message = name;
125  ellAdd(&errnumlist, (ELLNODE*)pNew);
126  return 0;
127 }
long errNum
Definition: errSymLib.c:36
const char * message
Definition: errSymLib.c:38
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
List node type.
Definition: ellLib.h:45
void errSymDump ( void  )

Definition at line 204 of file errSymLib.c.

205 {
206  int i;
207  int msgcount = 0;
208 
209  if (!initialized) errSymBld();
210 
211  msgcount = 0;
212  printf("errSymDump: number of hash slots = %d\n", NHASH);
213  for (i = 0; i < NHASH; i++) {
214  ERRNUMNODE **phashnode = &hashtable[i];
215  ERRNUMNODE *pNextNode = *phashnode;
216  int count = 0;
217 
218  while (pNextNode) {
219  int modnum = pNextNode->errNum >> 16;
220  int errnum = pNextNode->errNum & 0xffff;
221 
222  if (!count++) {
223  printf("HASHNODE = %d\n", i);
224  }
225  printf("\tmod %d num %d \"%s\"\n",
226  modnum , errnum , pNextNode->message);
227  phashnode = &pNextNode->hashnode;
228  pNextNode = *phashnode;
229  }
230  msgcount += count;
231  }
232  printf("\nerrSymDump: total number of error messages = %d\n", msgcount);
233 }
int i
Definition: scan.c:967
#define printf
Definition: epicsStdio.h:41
long errNum
Definition: errSymLib.c:36
const char * message
Definition: errSymLib.c:38
int errSymBld(void)
Definition: errSymLib.c:55
#define NHASH
Definition: errSymLib.c:30
struct errnumnode * hashnode
Definition: errSymLib.c:37
void errSymLookup ( long  status,
char *  pBuf,
size_t  bufLength 
)

Definition at line 190 of file errSymLib.c.

191 {
192  const char* msg = errSymLookupInternal(status);
193  if(msg) {
194  strncpy(pBuf, msg, bufLength-1);
195  pBuf[bufLength-1] = '\0';
196  return;
197  }
198  errRawCopy(status, pBuf, bufLength);
199 }
pvd::Status status
const char* errSymMsg ( long  status)

Definition at line 181 of file errSymLib.c.

182 {
183  const char* msg = errSymLookupInternal(status);
184  return msg ? msg : "<Unknown code>";
185 }
pvd::Status status
void errSymTest ( epicsUInt16  modnum,
epicsUInt16  begErrNum,
epicsUInt16  endErrNum 
)

Definition at line 265 of file errSymLib.c.

267 {
268  long errNum;
269  epicsUInt16 errnum;
270 
271  if (!initialized) errSymBld();
272  if (modnum < 501)
273  return;
274 
275  /* print range of error messages */
276  for (errnum = begErrNum; errnum <= endErrNum; errnum++) {
277  errNum = modnum << 16;
278  errNum |= (errnum & 0xffff);
279  errSymTestPrint(errNum);
280  }
281 }
void errSymTestPrint(long errNum)
Definition: errSymLib.c:239
unsigned short epicsUInt16
Definition: epicsTypes.h:41
int errSymBld(void)
Definition: errSymLib.c:55
void errSymTestPrint ( long  errNum)

Definition at line 239 of file errSymLib.c.

240 {
241  char message[256];
242  epicsUInt16 modnum;
243  epicsUInt16 errnum;
244 
245  if (!initialized) errSymBld();
246 
247  message[0] = '\0';
248  modnum = (epicsUInt16) (errNum >> 16);
249  errnum = (epicsUInt16) (errNum & 0xffff);
250  if (modnum < 501) {
251  fprintf(stderr, "Usage: errSymTestPrint(long errNum) \n");
252  fprintf(stderr, "errSymTestPrint: module number < 501 \n");
253  return;
254  }
255  errSymLookup(errNum, message, sizeof(message));
256  if ( message[0] == '\0' ) return;
257  printf("module %hu number %hu message=\"%s\"\n",
258  modnum, errnum, message);
259  return;
260 }
unsigned short epicsUInt16
Definition: epicsTypes.h:41
void errSymLookup(long status, char *pBuf, size_t bufLength)
Definition: errSymLib.c:190
#define printf
Definition: epicsStdio.h:41
int errSymBld(void)
Definition: errSymLib.c:55
#define stderr
Definition: epicsStdio.h:32

Variable Documentation

ERRSYMTAB_ID errSymTbl