00001
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 #include "error.h"
00032 #include "qvalue.h"
00033
00034
00035
00036
00037
00038 int str2q(qvalue_t* q, char* s, int len)
00039 {
00040 int i, digits, order;
00041
00042
00043 enum {
00044 ST_START,
00045 ST_0,
00046 ST_1,
00047 ST_0_PT,
00048 ST_1_PT,
00049 ST_1_PT_0,
00050 ST_0_PT_N
00051 } state = ST_START;
00052
00053 if (!q || !s) {
00054 return E_INVALID_PARAMS;
00055 }
00056
00057 digits = 1;
00058 order = 100;
00059 for(i = 0; i < len; i++) {
00060 switch(state) {
00061 case ST_START:
00062 switch(s[i]) {
00063 case ' ':
00064 case '\t':
00065 break;
00066
00067 case '0':
00068 *q = 0;
00069 state = ST_0;
00070 break;
00071
00072 case '1':
00073 *q = 1000;
00074 state = ST_1;
00075 break;
00076
00077 case '.':
00078 state = ST_0_PT;
00079 break;
00080
00081 default:
00082 return E_Q_INV_CHAR;
00083 }
00084 break;
00085
00086 case ST_0:
00087 switch(s[i]) {
00088 case '0':
00089 break;
00090
00091 case '.':
00092 state = ST_0_PT;
00093 break;
00094
00095 case '1':
00096 *q = 1000;
00097 state = ST_1;
00098 break;
00099
00100 default:
00101 if (s[i] >= '2' && s[i] <= '9') {
00102 return E_Q_TOO_BIG;
00103 } else {
00104 return E_Q_INV_CHAR;
00105 }
00106 }
00107 break;
00108
00109 case ST_1:
00110 if (s[i] == '.') {
00111 state = ST_1_PT;
00112 break;
00113 } else {
00114 if (s[i] >= '0' && s[i] <= '9') {
00115 return E_Q_TOO_BIG;
00116 } else {
00117 return E_Q_INV_CHAR;
00118 }
00119 }
00120 break;
00121
00122 case ST_0_PT:
00123 if (s[i] >= '0' && s[i] <= '9') {
00124 *q = (s[i] - '0') * order;
00125 order /= 10;
00126 state = ST_0_PT_N;
00127 } else {
00128 return E_Q_INV_CHAR;
00129 }
00130 break;
00131
00132 case ST_1_PT:
00133 if (s[i] == '0') {
00134 state = ST_1_PT_0;
00135 } else {
00136 if (s[i] >= '1' && s[i] <= '9') {
00137 return E_Q_TOO_BIG;
00138 } else {
00139 return E_Q_INV_CHAR;
00140 }
00141 }
00142 break;
00143
00144 case ST_1_PT_0:
00145 if (s[i] == '0') {
00146 break;
00147 } else {
00148 if (s[i] >= '1' && s[i] <= '9') {
00149 return E_Q_TOO_BIG;
00150 } else {
00151 return E_Q_INV_CHAR;
00152 }
00153 }
00154 break;
00155
00156 case ST_0_PT_N:
00157 if (s[i] >= '0' && s[i] <= '9') {
00158 if (digits <= 3) {
00159 *q += (s[i] - '0') * order;
00160 order /= 10;
00161 digits++;
00162 }
00163 } else {
00164 return E_Q_INV_CHAR;
00165 }
00166 break;
00167 }
00168 }
00169
00170 switch(state) {
00171 case ST_START:
00172 return E_Q_EMPTY;
00173
00174 case ST_0_PT:
00175 case ST_1_PT:
00176 return E_Q_DEC_MISSING;
00177
00178 default:
00179 return 0;
00180 }
00181 }