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)2160027Storekerror_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