Commit | Line | Data |
---|---|---|
e790d959 C |
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 char *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(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 | } |