1 /*
2  * $Header: error_message.c,v 1.1 86/11/10 21:34:34 spook Exp $
3  * $Source: /mit/s/p/spook/Work/et/RCS/error_message.c,v $
4  * $Locker: spook $
5  *
6  * Copyright 1987 by the Student Information Processing Board
7  * of the Massachusetts Institute of Technology
8  *
9  * For copyright info, see "mit-sipb-copyright.h".
10  */
11 
12 #include <stdio.h>
13 #include "error_table.h"
14 #include "mit-sipb-copyright.h"
15 extern const char *const sys_errlist[];
16 extern int sys_nerr;
17 
18 static char buffer[25];
19 
20 char *
21 error_message(code)
22      int code;
23 {
24      register int offset;
25      register error_table **et;
26      register int table_num;
27      register int div;
28      register char *cp;
29 
30      offset = code & ((1<<ERRCODE_RANGE)-1);
31      table_num = code - offset;
32      if ((_et_list == (error_table **)NULL) && table_num)
33 	  goto oops;
34      if (!table_num) {
35 	  if (offset < sys_nerr)
36 	       return((char *)sys_errlist[offset]);
37 	  else
38 	       goto oops;
39      }
40      for (et = _et_list; *et != (error_table *)NULL; et++) {
41 	  if ((*et)->base == table_num) {
42 	       /* This is the right table */
43 	       if ((*et)->n_msgs <= offset)
44 		    goto oops;
45 	       return((*et)->msgs[offset]);
46 	  }
47      }
48  oops:
49      cp = buffer;
50      {
51 	  register char *cp1;
52 	  for (cp1 = "Unknown code "; *cp1; cp1++, cp++)
53 	       *cp = *cp1;
54 	  if (table_num) {
55 	       for (cp1 = error_table_name(table_num); *cp1; cp1++, cp++)
56 		    *cp = *cp1;
57 	       *cp++ = ' ';
58 	       *cp = '\0';
59 	  }
60      }
61      div = 1000000000;
62      if (offset == 0) {
63 	  *cp++ = '0';
64 	  *cp = '\0';
65 	  return(buffer);
66      }
67      while (div > offset)
68 	  div /= 10;
69      do {
70 	  register int n = offset / div;
71 	  *cp++ = '0' + n;
72 	  offset -= n * div;
73 	  div /= 10;
74      } while (offset && div);
75      while (div) {
76 	  *cp++ = '0';
77 	  div /= 10;
78      }
79      *cp = '\0';
80      return(buffer);
81 }
82