1 /*
2  * sepparam.c -- separate parameter
3  *
4  * Copyright (C) 1990,1997,1999,2003 by Yoshifumi Mori
5  *
6  * tab:4
7  */
8 
9 #include "cdefs.h"
10 #include "extern.h"
11 
12 /*
13  * ʬ����ʸ����(str)�� buf[] �˳�Ǽ����
14  * �ץ�ե��å���ʸ��(precode, precode2) ��������ϡ�
15  * str �����˳�Ǽ����
16  */
17 static
setbufcode(char ** buf,const char * str,char precode,char precode2)18 void setbufcode(char **buf, const char *str, char precode, char precode2)
19 {
20 	char	*bp;
21 
22 	bp = *buf;
23 
24 	if (precode != '\0') {
25 		*bp++ = precode;
26 	}
27 	if (precode2 != '\0') {
28 		*bp++ = precode2;
29 	}
30 	strcpy(bp, str);
31 	while (*bp != '\0') {
32 		bp++;
33 	}
34 
35 	*buf = ++bp;
36 }
37 
38 /*
39  * ʸ���� str �� ',' ��ʬ���ƥХåե� buf[] �˳�Ǽ����
40  * ���Υݥ����� *ptr[] �����ꤹ��
41  * rtbl[] �ˤϡ��ϰϻ���������ˤ����ϰϤ���������
42  * *ptr[], rtbl[] �� maxptr ���礭��
43  */
separate_param(char * str,char * buf,char ** ptr,int maxptr,struct SRANGE_T * rtbl)44 int separate_param(char *str, char *buf, char **ptr, int maxptr, struct SRANGE_T *rtbl)
45 {
46 	char	*lasts = NULL;
47 	char	*sp;
48 	int		ptr_cnt;
49 	int		range_cnt;
50 
51 	if (rtbl != NULL) {
52 		for (range_cnt = 0; range_cnt < maxptr; range_cnt++) {
53 			rtbl[range_cnt].bmonth = 0;
54 			rtbl[range_cnt].emonth = 0;
55 			rtbl[range_cnt].start = 0;
56 			rtbl[range_cnt].end = 0;
57 		}
58 	}
59 	ptr_cnt = 0;
60 	range_cnt = 0;
61 
62 	sp = strtok_r(str, ",", &lasts);
63 	while (sp != NULL) {
64 		char	precode, precode2;
65 		char	*sp2;
66 
67 		precode = precode2 = '\0';
68 		if (strchr("!%.", *sp) != NULL) {
69 			precode = *sp++;
70 		}
71 		if (*sp == '-') {
72 			precode2 = '-';
73 			sp++;
74 		}
75 
76 		if ((sp2 = strchr(sp, '-')) != NULL) {
77 			int	sc, ec;
78 			int	dir;
79 
80 			*sp2 = '\0';
81 			sc = atoi(sp);
82 			ec = atoi(sp2 + 1);
83 			if (range_cnt < maxptr) {
84 				if (rtbl != NULL) {
85 					if (precode2 == '-') {
86 						rtbl->start = -sc;
87 						rtbl->end = -ec;
88 					} else {
89 						rtbl->start = sc;
90 						rtbl->end = ec;
91 					}
92 					if (rtbl->start > rtbl->end) {
93 						int	tmp;
94 
95 						tmp = rtbl->start;
96 						rtbl->start = rtbl->end;
97 						rtbl->end = tmp;
98 					}
99 					rtbl++;
100 					range_cnt++;
101 				}
102 			} else {
103 				errprint("separate_param", ERR_PANIC, "range_cnt >= maxptr");
104 			}
105 			if (sc > ec) {
106 				dir = -1;
107 				ec--;
108 			} else {
109 				dir = 1;
110 				ec++;
111 			}
112 
113 			do {
114 				if (ptr_cnt < maxptr) {
115 					char	strbuf[12];
116 
117 					ptr[ptr_cnt] = buf;
118 					sprintf(strbuf, "%d", sc);
119 					setbufcode(&buf, strbuf, precode, precode2);
120 					ptr_cnt++;
121 				} else {
122 					errprint("separate_param", ERR_PANIC, "ptr_cnt >= maxptr");
123 				}
124 				sc += dir;
125 			} while (sc != ec);
126 		} else {
127 			if (ptr_cnt < maxptr) {
128 				ptr[ptr_cnt] = buf;
129 				setbufcode(&buf, sp, precode, precode2);
130 				ptr_cnt++;
131 			} else {
132 				errprint("separate_param", ERR_PANIC, "ptr_cnt >= maxptr");
133 			}
134 		}
135 
136 		sp = strtok_r(NULL, ",", &lasts);
137 	}
138 
139 	return (ptr_cnt);
140 }
141 
142 /*
143  * ʸ���� str �� ',' ��ʬ���ơ������ǤΥݥ����� *ptr[] �����ꤹ��
144  * *ptr[] �� maxptr ���礭��
145  */
separate_param2(char * str,char ** ptr,int maxptr)146 int separate_param2(char *str, char **ptr, int maxptr)
147 {
148 	char	*lasts = NULL;
149 	char	*sp;
150 	int		ptr_cnt;
151 
152 	ptr_cnt = 0;
153 
154 	sp = strtok_r(str, ",", &lasts);
155 	while (sp != NULL) {
156 		if (ptr_cnt < maxptr) {
157 			ptr[ptr_cnt] = sp;
158 			ptr_cnt++;
159 		} else {
160 			errprint("separate_param2", ERR_PANIC, "ptr_cnt >= maxptr");
161 		}
162 		sp = strtok_r(NULL, ",", &lasts);
163 	}
164 
165 	return (ptr_cnt);
166 }
167