160027Storek /*
260027Storek  * $Header: error_message.c,v 1.1 86/11/10 21:34:34 spook Exp $
360027Storek  * $Source: /mit/s/p/spook/Work/et/RCS/error_message.c,v $
460027Storek  * $Locker: spook $
560027Storek  *
660027Storek  * Copyright 1987 by the Student Information Processing Board
760027Storek  * of the Massachusetts Institute of Technology
860027Storek  *
960027Storek  * For copyright info, see "mit-sipb-copyright.h".
1060027Storek  */
1160027Storek 
1260027Storek #include <stdio.h>
1360027Storek #include "error_table.h"
1460027Storek #include "mit-sipb-copyright.h"
1560028Storek extern const char *const sys_errlist[];
1660027Storek extern int sys_nerr;
1760027Storek 
1860027Storek static char buffer[25];
1960027Storek 
2060027Storek char *
error_message(code)2160027Storek error_message(code)
2260027Storek      int code;
2360027Storek {
2460027Storek      register int offset;
2560027Storek      register error_table **et;
2660027Storek      register int table_num;
2760027Storek      register int div;
2860027Storek      register char *cp;
2960027Storek 
3060027Storek      offset = code & ((1<<ERRCODE_RANGE)-1);
3160027Storek      table_num = code - offset;
3260027Storek      if ((_et_list == (error_table **)NULL) && table_num)
3360027Storek 	  goto oops;
3460027Storek      if (!table_num) {
3560027Storek 	  if (offset < sys_nerr)
36*60178Sbostic 	       return((char *)sys_errlist[offset]);
3760027Storek 	  else
3860027Storek 	       goto oops;
3960027Storek      }
4060027Storek      for (et = _et_list; *et != (error_table *)NULL; et++) {
4160027Storek 	  if ((*et)->base == table_num) {
4260027Storek 	       /* This is the right table */
4360027Storek 	       if ((*et)->n_msgs <= offset)
4460027Storek 		    goto oops;
4560027Storek 	       return((*et)->msgs[offset]);
4660027Storek 	  }
4760027Storek      }
4860027Storek  oops:
4960027Storek      cp = buffer;
5060027Storek      {
5160027Storek 	  register char *cp1;
5260027Storek 	  for (cp1 = "Unknown code "; *cp1; cp1++, cp++)
5360027Storek 	       *cp = *cp1;
5460027Storek 	  if (table_num) {
5560027Storek 	       for (cp1 = error_table_name(table_num); *cp1; cp1++, cp++)
5660027Storek 		    *cp = *cp1;
5760027Storek 	       *cp++ = ' ';
5860027Storek 	       *cp = '\0';
5960027Storek 	  }
6060027Storek      }
6160027Storek      div = 1000000000;
6260027Storek      if (offset == 0) {
6360027Storek 	  *cp++ = '0';
6460027Storek 	  *cp = '\0';
6560027Storek 	  return(buffer);
6660027Storek      }
6760027Storek      while (div > offset)
6860027Storek 	  div /= 10;
6960027Storek      do {
7060027Storek 	  register int n = offset / div;
7160027Storek 	  *cp++ = '0' + n;
7260027Storek 	  offset -= n * div;
7360027Storek 	  div /= 10;
7460027Storek      } while (offset && div);
7560027Storek      while (div) {
7660027Storek 	  *cp++ = '0';
7760027Storek 	  div /= 10;
7860027Storek      }
7960027Storek      *cp = '\0';
8060027Storek      return(buffer);
8160027Storek }
82