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