xref: /onnv-gate/usr/src/lib/libast/common/string/strelapsed.c (revision 12068:08a39a083754)
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  * Glenn Fowler
254887Schin  * AT&T Bell Laboratories
264887Schin  *
274887Schin  * parse elapsed time in 1/n secs from s
284887Schin  * compatible with fmtelapsed()
294887Schin  * also handles ps [day-][hour:]min:sec
304887Schin  * also handles coshell % for 'infinity'
314887Schin  * if e!=0 then it is set to first unrecognized char
324887Schin  */
334887Schin 
344887Schin #include <ast.h>
354887Schin #include <ctype.h>
364887Schin 
374887Schin unsigned long
strelapsed(register const char * s,char ** e,int n)384887Schin strelapsed(register const char* s, char** e, int n)
394887Schin {
404887Schin 	register int		c;
414887Schin 	register unsigned long	v;
424887Schin 	unsigned long		t = 0;
434887Schin 	int			f = 0;
444887Schin 	int			p = 0;
458462SApril.Chin@Sun.COM 	int			z = 1;
464887Schin 	int			m;
474887Schin 	const char*		last;
484887Schin 
494887Schin 	for (;;)
504887Schin 	{
514887Schin 		while (isspace(*s) || *s == '_')
524887Schin 			s++;
534887Schin 		if (!*(last = s))
544887Schin 			break;
558462SApril.Chin@Sun.COM 		if (z)
568462SApril.Chin@Sun.COM 		{
578462SApril.Chin@Sun.COM 			z = 0;
588462SApril.Chin@Sun.COM 			if (*s == '0' && (!(c = *(s + 1)) || isspace(c) || c == '_'))
598462SApril.Chin@Sun.COM 			{
608462SApril.Chin@Sun.COM 				last = s + 1;
618462SApril.Chin@Sun.COM 				break;
628462SApril.Chin@Sun.COM 			}
638462SApril.Chin@Sun.COM 		}
644887Schin 		v = 0;
654887Schin 		while ((c = *s++) >= '0' && c <= '9')
664887Schin 			v = v * 10 + c - '0';
674887Schin 		v *= n;
684887Schin 		if (c == '.')
694887Schin 			for (m = n; (c = *s++) >= '0' && c <= '9';)
704887Schin 				f += (m /= 10) * (c - '0');
714887Schin 		if (c == '%')
724887Schin 		{
734887Schin 			t = ~t;
744887Schin 			last = s;
754887Schin 			break;
764887Schin 		}
774887Schin 		if (s == last + 1)
784887Schin 			break;
794887Schin 		if (!p)
804887Schin 			while (isspace(c) || c == '_')
814887Schin 				c = *s++;
824887Schin 		switch (c)
834887Schin 		{
844887Schin 		case 'S':
854887Schin 			if (*s == 'E' || *s == 'e')
864887Schin 			{
874887Schin 				v += f;
884887Schin 				f = 0;
894887Schin 			}
904887Schin 			else
914887Schin 				v *= 20 * 12 * 4 * 7 * 24 * 60 * 60;
924887Schin 			break;
934887Schin 		case 'y':
944887Schin 		case 'Y':
954887Schin 			v *= 12 * 4 * 7 * 24 * 60 * 60;
964887Schin 			break;
974887Schin 		case 'M':
984887Schin 			if (*s == 'I' || *s == 'i')
994887Schin 				v *= 60;
1004887Schin 			else
1014887Schin 				v *= 4 * 7 * 24 * 60 * 60;
1024887Schin 			break;
1034887Schin 		case 'w':
1044887Schin 			v *= 7 * 24 * 60 * 60;
1054887Schin 			break;
1064887Schin 		case '-':
1074887Schin 			p = 1;
1084887Schin 			/*FALLTHROUGH*/
1094887Schin 		case 'd':
1104887Schin 			v *= 24 * 60 * 60;
1114887Schin 			break;
1124887Schin 		case 'h':
1134887Schin 			v *= 60 * 60;
1144887Schin 			break;
1154887Schin 		case ':':
1164887Schin 			p = 1;
1174887Schin 			v *= strchr(s, ':') ? (60 * 60) : 60;
1184887Schin 			break;
1194887Schin 		case 'm':
1204887Schin 			if (*s == 'o')
1214887Schin 				v *= 4 * 7 * 24 * 60 * 60;
1224887Schin 			else
1234887Schin 				v *= 60;
1244887Schin 			break;
1254887Schin 		case 's':
1264887Schin 			if (*s == 'c')
1274887Schin 			{
1284887Schin 				v *= 20 * 12 * 4 * 7 * 24 * 60 * 60;
1294887Schin 				break;
1304887Schin 			}
1314887Schin 			v += f;
1324887Schin 			f = 0;
1334887Schin 			break;
134*12068SRoger.Faulkner@Oracle.COM 		case 0:
135*12068SRoger.Faulkner@Oracle.COM 			s--;
136*12068SRoger.Faulkner@Oracle.COM 			v += f;
137*12068SRoger.Faulkner@Oracle.COM 			break;
1384887Schin 		default:
1394887Schin 			if (p)
1404887Schin 			{
1414887Schin 				last = s - 1;
1424887Schin 				t += v + f;
1434887Schin 			}
1444887Schin 			goto done;
1454887Schin 		}
1464887Schin 		t += v;
1474887Schin 		while (isalpha(*s))
1484887Schin 			s++;
1494887Schin 	}
1504887Schin  done:
1514887Schin 	if (e)
1524887Schin 		*e = (char*)last;
1534887Schin 	return t;
1544887Schin }
155