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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "ekapi_ia64.h"
00044 #include "ekapi_util.h"
00045
00046
00047 int EKAPI_LitClassCount(void *pknobs)
00048 {
00049 return KAPI_count4attribute(pknobs, "literal");
00050 }
00051
00052
00053 char *EKAPI_LitClassName(void *pknobs, int lcid)
00054 {
00055 char *str_knob, *str;
00056 char *name;
00057 str_knob = KAPI_attribute4index(pknobs, "literal", lcid);
00058 FmtAssert(str_knob, ("Literal Class string index %d is not exited!", lcid));
00059 str = StrTrim(strtok(str_knob, ","));
00060 name = strdup(str);
00061
00062 free(str_knob);
00063 return name;
00064 }
00065
00066
00067 int EKAPI_LitClassid4name(void *pknobs, char *name)
00068 {
00069 int i;
00070 char *tempname;
00071 BOOL find=0;
00072
00073
00074 for (i=0; i<EKAPI_LitClassCount(pknobs); i++)
00075 {
00076 tempname = EKAPI_LitClassName(pknobs, i);
00077 if (strcmp(name, tempname)==0) {
00078 find = 1;
00079 break;
00080 }
00081 free(tempname);
00082 }
00083
00084 if (find) {
00085 return i;
00086 }
00087 else {
00088 return -1;
00089 }
00090 }
00091
00092
00093 BOOL EKAPI_LitIsSigned(void *pknobs, int lcid)
00094 {
00095 char *str_knob, *str;
00096 BOOL sign = -1;
00097 str_knob = KAPI_attribute4index(pknobs, "literal", lcid);
00098 FmtAssert(str_knob, ("Literal Class string index %d is not exited!", lcid));
00099 str = strtok(str_knob, ",");
00100 str = StrTrim(strtok(NULL, ","));
00101
00102 if (strcmp(str, "SIGNED")==0) sign = 1;
00103 if (strcmp(str, "UNSIGNED") == 0) sign =0;
00104 Is_True((strcmp(str, "SIGNED")==0) || (strcmp(str, "UNSIGNED") == 0),
00105 ("Literal Sign in line %d sytax Wrong!\n", lcid)
00106 );
00107
00108 free(str_knob);
00109 return sign;
00110 }
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 int EKAPI_GetLcRange(void *pknobs, int lcid, EKAPI_RANGE ranges[])
00122 {
00123 char *str_knob, *str;
00124 BOOL sign = 0;
00125 int iknob, j;
00126 INT64 min, max;
00127
00128 str_knob = KAPI_attribute4index(pknobs, "literal", lcid);
00129 FmtAssert(str_knob, ("Literal Class string is not exited!"));
00130 str = strtok(str_knob, ",");
00131 str = StrTrim(strtok(NULL, ","));
00132
00133 if (strcmp(str, "SIGNED")==0) sign = 1;
00134 if (strcmp(str, "UNSIGNED") == 0) sign =0;
00135 Is_True((strcmp(str, "SIGNED")==0) || (strcmp(str, "UNSIGNED") == 0),
00136 ("Literal Sign in Line %d sytax Wrong!", lcid)
00137 );
00138
00139 j = 0;
00140 while (str = StrTrim(strtok(NULL, ",")))
00141 {
00142 min = 0; max = 0;
00143 switch (str[0])
00144 {
00145 case '*':
00146 iknob = atoi(str+1);
00147 if (sign) {
00148 min = (1LL << (iknob-1)) * (-1);
00149 max = (1LL << (iknob-1)) -1 ;
00150 }
00151 else {
00152 min = 0;
00153 max = (1ULL << iknob) -1;
00154 }
00155 break;
00156 case '@':
00157 iknob = atol(str+1);
00158 min = iknob;
00159 max = iknob;
00160 break;
00161 case '?':
00162 iknob = strlen(str) - strlen(strstr(str, ":")) + 1;
00163 assert(iknob < strlen(str));
00164 max = (INT64)strtod(str+iknob, NULL);
00165 str[iknob-1] = '\0';
00166 min = (INT64)strtod(str+1, NULL);
00167
00168 break;
00169 default:
00170 free(str_knob);
00171 Is_True( 0, ("Literal Class: Unknown range!"));
00172 break;
00173 }
00174 ranges[j].min = min;
00175 ranges[j].max = max;
00176 j++;
00177 }
00178 free(str_knob);
00179 return j;
00180 }
00181