Go to the documentation of this file.00001 #pragma ident "@(#)92/msgnew/catmsgfmt.c 92.2 06/03/99 09:59:18"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifdef _LITTLE_ENDIAN
00038 #pragma weak _catmsgfmt = catmsgfmt
00039 #else
00040 #if defined(__STDC__) && !defined(_LIBU)
00041 #pragma weak catmsgfmt = _catmsgfmt
00042 #endif
00043 #endif
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #define DISABLE_NL_TYPES_SYMBOL_RENAMING 1
00060
00061 #include <locale.h>
00062 #include <stdio.h>
00063 #include <string.h>
00064 #include <stdlib.h>
00065 #include <time.h>
00066 #include <nl_types.h>
00067
00068 #include <cray/nlcatmsg.h>
00069
00070
00071
00072 #ifndef MSG_FORMAT
00073 # define MSG_FORMAT "MSG_FORMAT"
00074 #endif
00075
00076 #ifndef D_MSG_FORMAT
00077 # define D_MSG_FORMAT "%G-%N %C: %S %P\n %M\n"
00078 #endif
00079
00080 #define OCTAL 8
00081 #define HEXADECIMAL 16
00082 #define MAXTIME 51
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 char *
00115 catmsgfmt(
00116 const char *cmdname,
00117 const char *groupcode,
00118 int msg_num,
00119 const char *severity,
00120 const char *msgtext,
00121 char *buf,
00122 int buflen,
00123 char *pos,
00124 char *dbg
00125 )
00126 {
00127 char c;
00128 char *fmtp;
00129 char *cmsp;
00130 char *tknp;
00131 char *tncp;
00132 char *tfmt;
00133 char num[20];
00134 char tms[MAXTIME];
00135 int cmsl;
00136 time_t cts;
00137 struct tm *ltsp;
00138
00139 if ((buflen < 1) || (msg_num < 1))
00140 return( (char *) NULL);
00141
00142
00143 (void) sprintf(num, "%d", msg_num);
00144
00145
00146 *tms = '\0';
00147
00148
00149 if ((fmtp = getenv(MSG_FORMAT)) == NULL)
00150 fmtp = D_MSG_FORMAT;
00151
00152 cmsl = 1;
00153 cmsp = buf;
00154
00155 while ((*fmtp != '\0') && (cmsl < buflen))
00156 if ((c = *fmtp++) != '%') {
00157 cmsl++;
00158 if (c != '\\')
00159 *cmsp++ = c;
00160 else {
00161 switch (*fmtp) {
00162
00163 case 'a' : c = '\a';
00164 break;
00165
00166 case 'b' : c = '\b';
00167 break;
00168
00169 case 'f' : c = '\f';
00170 break;
00171
00172 case 'n' : c = '\n';
00173 break;
00174
00175 case 'r' : c = '\r';
00176 break;
00177
00178 case 't' : c = '\t';
00179 break;
00180
00181 case 'v' : c = '\v';
00182 break;
00183
00184 case 'x' :
00185 c = (char)strtol(fmtp + 1,
00186 &tncp, HEXADECIMAL);
00187 if (tncp == (fmtp + 1))
00188 c = *fmtp;
00189 else
00190 fmtp = tncp - 1;
00191 break;
00192
00193 case '\\': c = '\\';
00194 break;
00195
00196 case '?' : c = '?';
00197 break;
00198
00199 case '\'': c = '\'';
00200 break;
00201
00202 case '"' : c = '"';
00203 break;
00204
00205 case '0' :
00206 case '1' :
00207 case '2' :
00208 case '3' :
00209 case '4' :
00210 case '5' :
00211 case '6' :
00212 case '7' :
00213 c = (char) strtol(fmtp,
00214 &tncp, OCTAL);
00215 if (tncp == fmtp)
00216 c = *fmtp;
00217 else
00218 fmtp = tncp - 1;
00219 break;
00220
00221 default : c = *fmtp;
00222 }
00223
00224 *cmsp++ = c;
00225 fmtp++;
00226 }
00227 }
00228 else {
00229 switch (*fmtp) {
00230
00231 case '%':
00232 tknp = "%";
00233 break;
00234
00235 case 'C':
00236 tknp = (char *) cmdname;
00237 break;
00238
00239 case 'D':
00240 tknp = dbg;
00241 break;
00242
00243 case 'G':
00244 tknp = (char *) groupcode;
00245 break;
00246
00247 case 'N':
00248 tknp = num;
00249 break;
00250
00251 case 'P':
00252 tknp = pos;
00253 break;
00254
00255 case 'S':
00256 tknp = (char *) severity;
00257 break;
00258
00259 case 'T':
00260 tknp = tms;
00261
00262 if (*tms == '\0') {
00263 (void) time(&cts);
00264 ltsp = localtime(&cts);
00265 tfmt = getenv("CFTIME");
00266 if (tfmt == NULL ||
00267 *tfmt == '\0')
00268
00269 tfmt = "%a %b %e %H:%M:%S %Z %Y";
00270 (void) strftime(tms, MAXTIME,
00271 tfmt, ltsp);
00272 }
00273 break;
00274
00275 case 'M':
00276 tknp = (char *) msgtext;
00277 break;
00278
00279 default:
00280 *cmsp++ = c;
00281 if (cmsl++ < buflen)
00282 *cmsp++ = *fmtp;
00283 cmsl++;
00284 tknp = "";
00285 }
00286
00287 if (tknp != NULL) {
00288 while ((*tknp != '\0') && (cmsl++ < buflen))
00289 *cmsp++ = *tknp++;
00290 }
00291 fmtp++;
00292
00293 }
00294
00295 *cmsp = '\0';
00296
00297 return(buf);
00298 }