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