Changeset 9916 for trunk/psLib
- Timestamp:
- Nov 8, 2006, 3:58:52 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/types/psMetadataConfig.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/types/psMetadataConfig.c
r9912 r9916 10 10 * @author Eric Van Alst, MHPCC 11 11 * 12 * @version $Revision: 1.11 2$ $Name: not supported by cvs2svn $13 * @date $Date: 2006-11-09 0 0:03:44$12 * @version $Revision: 1.113 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2006-11-09 01:58:52 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 68 68 static psString formatMetadataItem(psMetadataItem *item); 69 69 static psArray *p_psMetadataKeyArray(psMetadata *md); 70 static bool parseGeneric(char* keyName, 71 psS32* level, 72 psArray* levelArray, 73 char* linePtr, 74 psS32 lineCount, 75 psMetadataFlags flags); 76 static bool parseType(char* keyName, 77 psS32* level, 78 psArray* levelArray, 79 char* linePtr, 80 psS32 lineCount, 81 psMetadataFlags flags); 82 static bool parseMetadataEnd(char* keyName, 83 psS32* level, 84 psArray* levelArray, 85 char* linePtr, 86 psS32 lineCount, 87 psMetadataFlags flags); 70 88 71 89 … … 1102 1120 { 1103 1121 psMetadataFlags flags = PS_META_DEFAULT; 1104 psS32 status = 0;1105 1122 1106 1123 // Set flags if overwrite specified … … 1116 1133 1117 1134 // Check for more than one '@' in a line 1135 // XXX this logic is wrong -- there's no reason a @ can't appear in a 1136 // comment 1118 1137 if (repeatedChars(linePtr, '@') > 1) { 1119 1138 psError(PS_ERR_IO, true, … … 1123 1142 1124 1143 // Get metadata item name 1144 psS32 status = 0; 1125 1145 char *keyName = getToken(&linePtr, " ", &status, true); 1126 1146 if (status) { … … 1132 1152 1133 1153 // Check for special keyName values "TYPE", "END" 1134 if (strcmp(keyName,"TYPE") == 0 ) {1135 // Get the type name1136 char *strType = getToken(&linePtr, " ", &status, true);1137 if(!strType) {1138 psError(PS_ERR_IO,true,1139 _("Failed to read item type on line %u."), lineCount);1140 psFree(keyName);1141 return false;1142 }1143 if (status) {1144 psError(PS_ERR_IO, true,1145 _("Failed to read item type on line %u."), lineCount);1146 psFree(strType);1147 psFree(keyName);1148 return false;1149 }1150 1151 // attempt to parse the TYPE line into a template metadata1152 psMetadata *tempTemplate = getMetadataType(linePtr);1153 if (!tempTemplate) {1154 psError(PS_ERR_IO,true,1155 _("Metadata type '%s', found on line %u, is invalid."),1156 strType,lineCount);1157 psFree(keyName);1158 psFree(strType);1159 return false;1160 }1161 1162 // Access type array1163 psArray *typeArray = ((p_psParseLevelInfo*)(levelArray->data[*level]))->typeArray;1164 1165 // Check if type already exists in array1166 for (psS32 k = 0; k < psArrayLength(typeArray); k++) {1167 // Compare type name with the list of current types1168 if (strcmp(strType,(char*)typeArray->data[k]) == 0) {1169 psError(PS_ERR_IO,true,1170 _("Specified type, %s, on line %u is already defined."),1171 strType, lineCount);1172 psFree(tempTemplate);1173 psFree(keyName);1174 psFree(strType);1175 return false;1176 }1177 }1178 1179 // Add key name to array of type1180 typeArray = psArrayAdd(typeArray, 1, strType);1181 psFree(strType);1182 1183 // Add template to array of templates1184 psArray *templateArray = ((p_psParseLevelInfo*)(levelArray->data[*level]))->templateArray;1185 psArrayAdd(templateArray, 1, tempTemplate);1186 psFree(tempTemplate);1187 1188 return true;1189 }1190 1191 1154 if (strcmp(keyName, "END") == 0) { 1192 if ((*level) < 1) { 1193 psFree(keyName); 1194 return false; 1195 } 1196 1197 # if 1 1198 p_psParseLevelInfo *upperLevelInfo = ((p_psParseLevelInfo*)(levelArray->data[*level-1])); 1199 p_psParseLevelInfo *lowerLevelInfo = ((p_psParseLevelInfo*)(levelArray->data[*level])); 1200 // Check name in nonunique list 1201 for (psS32 k = 0; k < psArrayLength(upperLevelInfo->nonUniqueKeyArray); k++) { 1202 if (strcmp(upperLevelInfo->nonUniqueKeyArray->data[k], lowerLevelInfo->name) == 0) { 1203 flags = PS_META_DUPLICATE_OK; 1204 break; 1205 } 1206 } 1207 #endif 1208 1209 char *strValue = NULL; 1210 strValue = getToken(&linePtr, "#", &status, true); 1211 char *strComment = NULL; 1212 // XXX why is there a ~ here? 1213 strComment = getToken(&linePtr, "~", &status, true); 1214 1215 // Add metadata to upper level metadata 1216 if (!psMetadataAdd(upperLevelInfo->metadata, 1217 PS_LIST_TAIL, lowerLevelInfo->name, 1218 PS_DATA_METADATA | flags, 1219 strComment, //"", 1220 lowerLevelInfo->metadata)) { 1221 // This is pretty much a non-recoverable error - perhaps there 1222 // should be a way of signalling non-recoverable parse errors 1223 psError(PS_ERR_UNKNOWN, false, "failed to add metadata item"); 1224 psFree(strValue); 1225 psFree(strComment); 1226 psFree(keyName); 1227 return false; 1228 } 1229 1230 // Remove lower info level 1231 if(!psArrayRemoveIndex(levelArray, *level)) { 1232 psError(PS_ERR_UNKNOWN, false, "failed to remove array item"); 1233 psFree(strValue); 1234 psFree(strComment); 1235 psFree(keyName); 1236 } 1237 1238 // the END just moved us up one nesting level 1239 (*level)--; 1240 1241 psFree(strValue); 1242 psFree(strComment); 1243 psFree(keyName); 1244 1245 return true; 1246 } 1155 if (!parseMetadataEnd(keyName, level, levelArray, linePtr, lineCount, flags)) { 1156 goto FAIL; 1157 } 1158 } else if (strcmp(keyName,"TYPE") == 0 ) { 1159 if (!parseType(keyName, level, levelArray, linePtr, lineCount, flags)) { 1160 goto FAIL; 1161 } 1162 } else { 1163 if (!parseGeneric(keyName, level, levelArray, linePtr, lineCount, flags)) { 1164 goto FAIL; 1165 } 1166 } 1167 1168 psFree(keyName); 1169 1170 return true; 1171 1172 FAIL: 1173 psError(PS_ERR_UNKNOWN, false, 1174 _("Failed to parse line %u: %s."), lineCount, linePtr); 1175 psFree(keyName); 1176 return false; 1177 } 1178 1179 static bool parseGeneric(char* keyName, 1180 psS32* level, 1181 psArray* levelArray, 1182 char* linePtr, 1183 psS32 lineCount, 1184 psMetadataFlags flags) 1185 { 1186 PS_ASSERT_PTR_NON_NULL(keyName, false); 1187 PS_ASSERT_PTR_NON_NULL(level, false); 1188 PS_ASSERT_PTR_NON_NULL(levelArray, false); 1189 PS_ASSERT_PTR_NON_NULL(linePtr, false); 1247 1190 1248 1191 // Check if key name present in array of non-unique key names … … 1258 1201 // Parse metadataItem 1259 1202 if (!parseMetadataItem(keyName, level, levelArray, linePtr, lineCount, flags)) { 1260 psFree(keyName);1261 1203 return false; 1262 1204 } 1263 psFree(keyName); 1205 1206 return true; 1207 } 1208 1209 static bool parseType(char* keyName, 1210 psS32* level, 1211 psArray* levelArray, 1212 char* linePtr, 1213 psS32 lineCount, 1214 psMetadataFlags flags) 1215 { 1216 PS_ASSERT_PTR_NON_NULL(keyName, false); 1217 PS_ASSERT_PTR_NON_NULL(level, false); 1218 PS_ASSERT_PTR_NON_NULL(levelArray, false); 1219 PS_ASSERT_PTR_NON_NULL(linePtr, false); 1220 1221 // Get the type name 1222 psS32 status = 0; 1223 char *strType = getToken(&linePtr, " ", &status, true); 1224 if(!strType) { 1225 psError(PS_ERR_IO,true, 1226 _("Failed to read item type on line %u."), lineCount); 1227 return false; 1228 } 1229 if (status) { 1230 psError(PS_ERR_IO, true, 1231 _("Failed to read item type on line %u."), lineCount); 1232 psFree(strType); 1233 return false; 1234 } 1235 1236 // attempt to parse the TYPE line into a template metadata 1237 psMetadata *tempTemplate = getMetadataType(linePtr); 1238 if (!tempTemplate) { 1239 psError(PS_ERR_IO,true, 1240 _("Metadata type '%s', found on line %u, is invalid."), 1241 strType,lineCount); 1242 psFree(strType); 1243 return false; 1244 } 1245 1246 // Access type array 1247 psArray *typeArray = ((p_psParseLevelInfo*)(levelArray->data[*level]))->typeArray; 1248 1249 // Check if type already exists in array 1250 for (psS32 k = 0; k < psArrayLength(typeArray); k++) { 1251 // Compare type name with the list of current types 1252 if (strcmp(strType, (char*)typeArray->data[k]) == 0) { 1253 psError(PS_ERR_IO,true, 1254 _("Specified type, %s, on line %u is already defined."), 1255 strType, lineCount); 1256 psFree(tempTemplate); 1257 psFree(strType); 1258 return false; 1259 } 1260 } 1261 1262 // Add key name to array of type 1263 typeArray = psArrayAdd(typeArray, 0, strType); 1264 psFree(strType); 1265 1266 // Add template to array of templates 1267 psArray *templateArray = ((p_psParseLevelInfo*)(levelArray->data[*level]))->templateArray; 1268 psArrayAdd(templateArray, 0, tempTemplate); 1269 psFree(tempTemplate); 1270 1271 return true; 1272 } 1273 1274 static bool parseMetadataEnd(char* keyName, 1275 psS32* level, 1276 psArray* levelArray, 1277 char* linePtr, 1278 psS32 lineCount, 1279 psMetadataFlags flags) 1280 { 1281 PS_ASSERT_PTR_NON_NULL(keyName, false); 1282 PS_ASSERT_PTR_NON_NULL(level, false); 1283 PS_ASSERT_PTR_NON_NULL(levelArray, false); 1284 PS_ASSERT_PTR_NON_NULL(linePtr, false); 1285 1286 if ((*level) < 1) { 1287 psError(PS_ERR_UNKNOWN, false, "can not END the top level metadata"); 1288 return false; 1289 } 1290 1291 p_psParseLevelInfo *upperLevelInfo = ((p_psParseLevelInfo*)(levelArray->data[*level-1])); 1292 p_psParseLevelInfo *lowerLevelInfo = ((p_psParseLevelInfo*)(levelArray->data[*level])); 1293 // Check name in nonunique list 1294 for (psS32 k = 0; k < psArrayLength(upperLevelInfo->nonUniqueKeyArray); k++) { 1295 if (strcmp(upperLevelInfo->nonUniqueKeyArray->data[k], lowerLevelInfo->name) == 0) { 1296 flags = PS_META_DUPLICATE_OK; 1297 break; 1298 } 1299 } 1300 1301 char *strValue = NULL; 1302 psS32 status = 0; 1303 strValue = getToken(&linePtr, "#", &status, true); 1304 char *strComment = NULL; 1305 // XXX why is there a ~ here? 1306 strComment = getToken(&linePtr, "~", &status, true); 1307 1308 // Add metadata to upper level metadata 1309 if (!psMetadataAdd(upperLevelInfo->metadata, 1310 PS_LIST_TAIL, lowerLevelInfo->name, 1311 PS_DATA_METADATA | flags, 1312 strComment, //"", 1313 lowerLevelInfo->metadata)) { 1314 // This is pretty much a non-recoverable error - perhaps there 1315 // should be a way of signalling non-recoverable parse errors 1316 psError(PS_ERR_UNKNOWN, false, "failed to add metadata item"); 1317 psFree(strValue); 1318 psFree(strComment); 1319 return false; 1320 } 1321 1322 // Remove lower info level 1323 if(!psArrayRemoveIndex(levelArray, *level)) { 1324 psError(PS_ERR_UNKNOWN, false, "failed to remove array item"); 1325 psFree(strValue); 1326 psFree(strComment); 1327 } 1328 1329 // the END just moved us up one nesting level 1330 (*level)--; 1331 1332 psFree(strValue); 1333 psFree(strComment); 1264 1334 1265 1335 return true; … … 1365 1435 psFree(topLevelInfo); 1366 1436 1367 psList *doc = psStringSplit(str, "\n", false);1437 psList *doc = psStringSplit(str, "\n", true); 1368 1438 if (!doc) { 1369 1439 psError(PS_ERR_UNKNOWN, false, "failed to split string: %s", str);
Note:
See TracChangeset
for help on using the changeset viewer.
