14887Schin /***********************************************************************
24887Schin * *
34887Schin * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property *
54887Schin * and is licensed under the *
64887Schin * Common Public License, Version 1.0 *
78462SApril.Chin@Sun.COM * by AT&T Intellectual Property *
84887Schin * *
94887Schin * A copy of the License is available at *
104887Schin * http://www.opensource.org/licenses/cpl1.0.txt *
114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
124887Schin * *
134887Schin * Information and Software Systems Research *
144887Schin * AT&T Research *
154887Schin * Florham Park NJ *
164887Schin * *
174887Schin * Glenn Fowler <gsf@research.att.com> *
184887Schin * David Korn <dgk@research.att.com> *
194887Schin * Phong Vo <kpv@research.att.com> *
204887Schin * *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin
244887Schin /*
254887Schin * return the record format string given a format descriptor
264887Schin */
274887Schin
284887Schin #include <recfmt.h>
294887Schin #include <ctype.h>
304887Schin
314887Schin char*
fmtrec(Recfmt_t f,int fs)324887Schin fmtrec(Recfmt_t f, int fs)
334887Schin {
344887Schin char* b;
354887Schin char* e;
364887Schin char* s;
374887Schin long n;
384887Schin char del[2];
394887Schin
404887Schin b = s = fmtbuf(n = 32);
414887Schin e = b + n;
424887Schin switch (RECTYPE(f))
434887Schin {
444887Schin case REC_delimited:
454887Schin *s++ = 'd';
464887Schin if ((del[0] = REC_D_DELIMITER(f)) != '\n')
474887Schin {
484887Schin del[1] = 0;
494887Schin if (fs)
504887Schin sfsprintf(s, e - s, "0x%02x", *(unsigned char*)del);
514887Schin else
524887Schin sfsprintf(s, e - s, "%s", fmtquote(del, NiL, NiL, 1, 0));
534887Schin }
544887Schin else
554887Schin *s = 0;
564887Schin break;
574887Schin case REC_fixed:
584887Schin if (!fs)
594887Schin *s++ = 'f';
604887Schin sfsprintf(s, e - s, "%lu", REC_F_SIZE(f));
614887Schin break;
624887Schin case REC_variable:
634887Schin *s++ = 'v';
644887Schin if (n = REC_V_SIZE(f))
654887Schin s += sfsprintf(s, e - s, "%lu", n);
664887Schin if (REC_V_HEADER(f) != 4)
674887Schin s += sfsprintf(s, e - s, "h%u", REC_V_HEADER(f));
684887Schin if (REC_V_OFFSET(f) != 0)
694887Schin s += sfsprintf(s, e - s, "o%u", REC_V_OFFSET(f));
704887Schin if (REC_V_LENGTH(f) != 2)
714887Schin s += sfsprintf(s, e - s, "z%u", REC_V_LENGTH(f));
724887Schin if (REC_V_LITTLE(f) != 0)
734887Schin *s++ = 'l';
744887Schin if (REC_V_INCLUSIVE(f) == 0)
754887Schin *s++ = 'n';
764887Schin *s = 0;
774887Schin break;
784887Schin case REC_method:
794887Schin *s++ = 'm';
804887Schin switch (n = REC_M_INDEX(f))
814887Schin {
824887Schin case REC_M_data:
834887Schin sfsprintf(s, e - s, "data");
844887Schin break;
854887Schin case REC_M_path:
864887Schin sfsprintf(s, e - s, "path");
874887Schin break;
884887Schin default:
894887Schin sfsprintf(s, e - s, "%lu", n);
904887Schin break;
914887Schin }
924887Schin break;
934887Schin case REC_none:
944887Schin *s++ = 'n';
954887Schin *s = 0;
964887Schin break;
974887Schin default:
984887Schin sfsprintf(s, e - s, "u%u.0x%07x", RECTYPE(f), REC_U_ATTRIBUTES(f));
994887Schin break;
1004887Schin }
1014887Schin return b;
1024887Schin }
103