Lines Matching refs:pc
322 * @param pc Parsing context
328 handle_match (ParsingContext * pc, const char **attr)
347 pc->device->udi,
350 HAL_ERROR (("Could not resolve keypath '%s' on udi '%s'", key, pc->device->udi));
668 * @param pc Parsing context
672 handle_merge (ParsingContext * pc, const char **attr)
676 pc->merge_type = MERGE_TYPE_UNKNOWN;
688 strncpy (pc->merge_key, attr[1], MAX_KEY_SIZE);
695 pc->merge_type = MERGE_TYPE_STRING;
699 pc->merge_type = MERGE_TYPE_BOOLEAN;
703 pc->merge_type = MERGE_TYPE_INT32;
707 pc->merge_type = MERGE_TYPE_UINT64;
711 pc->merge_type = MERGE_TYPE_DOUBLE;
715 pc->merge_type = MERGE_TYPE_STRLIST;
719 pc->merge_type = MERGE_TYPE_COPY_PROPERTY;
728 * @param pc Parsing context
732 handle_append_prepend (ParsingContext * pc, const char **attr)
736 pc->merge_type = MERGE_TYPE_UNKNOWN;
747 strncpy (pc->merge_key, attr[1], MAX_KEY_SIZE);
754 pc->merge_type = MERGE_TYPE_STRING;
758 pc->merge_type = MERGE_TYPE_STRLIST;
762 pc->merge_type = MERGE_TYPE_COPY_PROPERTY;
772 * @param pc Parsing context
776 handle_spawn (ParsingContext * pc, const char **attr)
780 pc->merge_type = MERGE_TYPE_UNKNOWN;
792 strncpy (pc->merge_key, attr[1], MAX_KEY_SIZE);
794 pc->merge_type = MERGE_TYPE_SPAWN;
800 * @param pc Parsing context
804 handle_remove (ParsingContext * pc, const char **attr)
808 pc->merge_type = MERGE_TYPE_UNKNOWN;
819 strncpy (pc->merge_key, attr[1], MAX_KEY_SIZE);
827 pc->merge_type = MERGE_TYPE_STRLIST;
830 pc->merge_type = MERGE_TYPE_UNKNOWN;
834 pc->merge_type = MERGE_TYPE_REMOVE;
842 * @param pc Parsing context
846 handle_clear (ParsingContext * pc, const char **attr)
850 pc->merge_type = MERGE_TYPE_UNKNOWN;
866 strncpy (pc->merge_key, attr[1], MAX_KEY_SIZE);
868 pc->merge_type = MERGE_TYPE_CLEAR;
875 * @param pc Parsing context
878 parsing_abort (ParsingContext * pc)
882 pc->aborted = TRUE;
887 * @param pc Parsing context
892 start (ParsingContext * pc, const char *el, const char **attr)
894 if (pc->aborted)
897 pc->cdata_buf_len = 0;
899 pc->merge_type = MERGE_TYPE_UNKNOWN;
902 for (i = 0; i < pc->depth; i++)
911 printf(" curelem=%d\n", pc->curelem);
915 if (pc->curelem != CURELEM_DEVICE
916 && pc->curelem != CURELEM_MATCH) {
919 pc->file,
920 XML_GetCurrentLineNumber (pc->parser),
921 XML_GetCurrentColumnNumber (pc->parser)));
922 parsing_abort (pc);
925 pc->curelem = CURELEM_MATCH;
928 if (pc->match_ok) {
929 if (!handle_match (pc, attr)) {
931 pc->match_depth_first_fail = pc->depth;
932 pc->match_ok = FALSE;
936 if (pc->curelem != CURELEM_DEVICE
937 && pc->curelem != CURELEM_MATCH) {
940 pc->file,
941 XML_GetCurrentLineNumber (pc->parser),
942 XML_GetCurrentColumnNumber (pc->parser)));
943 parsing_abort (pc);
946 pc->curelem = CURELEM_MERGE;
947 if (pc->match_ok) {
948 handle_merge (pc, attr);
953 if (pc->curelem != CURELEM_DEVICE
954 && pc->curelem != CURELEM_MATCH) {
957 pc->file,
958 XML_GetCurrentLineNumber (pc->parser),
959 XML_GetCurrentColumnNumber (pc->parser)));
960 parsing_abort (pc);
963 pc->curelem = CURELEM_APPEND;
964 if (pc->match_ok) {
965 handle_append_prepend (pc, attr);
970 if (pc->curelem != CURELEM_DEVICE
971 && pc->curelem != CURELEM_MATCH) {
974 pc->file,
975 XML_GetCurrentLineNumber (pc->parser),
976 XML_GetCurrentColumnNumber (pc->parser)));
977 parsing_abort (pc);
980 pc->curelem = CURELEM_PREPEND;
981 if (pc->match_ok) {
982 handle_append_prepend (pc, attr);
987 if (pc->curelem != CURELEM_DEVICE
988 && pc->curelem != CURELEM_MATCH) {
991 pc->file,
992 XML_GetCurrentLineNumber (pc->parser),
993 XML_GetCurrentColumnNumber (pc->parser)));
994 parsing_abort (pc);
997 pc->curelem = CURELEM_REMOVE;
998 if (pc->match_ok) {
999 handle_remove (pc, attr);
1004 if (pc->curelem != CURELEM_DEVICE
1005 && pc->curelem != CURELEM_MATCH) {
1008 pc->file,
1009 XML_GetCurrentLineNumber (pc->parser),
1010 XML_GetCurrentColumnNumber (pc->parser)));
1011 parsing_abort (pc);
1014 pc->curelem = CURELEM_CLEAR;
1015 if (pc->match_ok) {
1016 handle_clear (pc, attr);
1021 if (pc->curelem != CURELEM_DEVICE_INFO) {
1024 pc->file,
1025 XML_GetCurrentLineNumber (pc->parser),
1026 XML_GetCurrentColumnNumber (pc->parser)));
1027 parsing_abort (pc);
1029 pc->curelem = CURELEM_DEVICE;
1031 if (pc->curelem != CURELEM_UNKNOWN) {
1034 pc->file,
1035 XML_GetCurrentLineNumber (pc->parser),
1036 XML_GetCurrentColumnNumber (pc->parser)));
1037 parsing_abort (pc);
1039 pc->curelem = CURELEM_DEVICE_INFO;
1041 if (pc->curelem != CURELEM_MATCH) {
1044 pc->file,
1045 XML_GetCurrentLineNumber (pc->parser),
1046 XML_GetCurrentColumnNumber (pc->parser)));
1047 parsing_abort (pc);
1050 pc->curelem = CURELEM_SPAWN;
1051 if (pc->match_ok) {
1052 handle_spawn (pc, attr);
1057 pc->file,
1058 XML_GetCurrentLineNumber (pc->parser),
1059 XML_GetCurrentColumnNumber (pc->parser), el));
1060 parsing_abort (pc);
1064 assert (pc->depth < MAX_DEPTH);
1066 pc->depth++;
1069 pc->curelem_stack[pc->depth] = pc->curelem;
1086 * @param pc Parsing context
1090 end (ParsingContext * pc, const char *el)
1092 if (pc->aborted)
1095 pc->cdata_buf[pc->cdata_buf_len] = '\0';
1097 /* printf(" curelem=%d\n", pc->curelem);*/
1099 if (pc->curelem == CURELEM_MERGE && pc->match_ok) {
1101 pc->device_matched = TRUE;
1103 switch (pc->merge_type) {
1105 hal_device_property_set_string (pc->device, pc->merge_key, pc->cdata_buf);
1110 int type = hal_device_property_get_type (pc->device, pc->merge_key);
1112 hal_device_property_remove (pc->device, pc->merge_key);
1113 hal_device_property_strlist_append (pc->device, pc->merge_key, pc->cdata_buf);
1123 value = strtol (pc->cdata_buf, NULL, 0);
1127 hal_device_property_set_int (pc->device,
1128 pc->merge_key, value);
1137 value = strtoull (pc->cdata_buf, NULL, 0);
1141 hal_device_property_set_uint64 (pc->device,
1142 pc->merge_key, value);
1147 hal_device_property_set_bool (pc->device, pc->merge_key,
1148 (strcmp (pc->cdata_buf,
1154 hal_device_property_set_double (pc->device, pc->merge_key,
1155 atof (pc->cdata_buf));
1166 if (!resolve_udiprop_path (pc->cdata_buf,
1167 pc->device->udi,
1170 HAL_ERROR (("Could not resolve keypath '%s' on udi '%s'", pc->cdata_buf, pc->device->udi));
1181 hal_device_copy_property (d, prop_to_merge, pc->device, pc->merge_key);
1189 pc->merge_type, pc->merge_type));
1192 } else if (pc->curelem == CURELEM_APPEND && pc->match_ok &&
1193 (hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRING ||
1194 hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRLIST ||
1195 hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_INVALID)) {
1200 pc->device_matched = TRUE;
1202 if (pc->merge_type == MERGE_TYPE_STRLIST) {
1203 hal_device_property_strlist_append (pc->device, pc->merge_key, pc->cdata_buf);
1207 switch (pc->merge_type) {
1209 strncpy (buf, pc->cdata_buf, sizeof (buf));
1213 hal_device_property_get_as_string (pc->device, pc->cdata_buf, buf, sizeof (buf));
1217 HAL_ERROR (("Unknown merge_type=%d='%c'", pc->merge_type, pc->merge_type));
1221 existing_string = hal_device_property_get_string (pc->device, pc->merge_key);
1228 hal_device_property_set_string (pc->device, pc->merge_key, buf2);
1230 } else if (pc->curelem == CURELEM_PREPEND && pc->match_ok &&
1231 (hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRING ||
1232 hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRLIST ||
1233 hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_INVALID)) {
1238 pc->device_matched = TRUE;
1240 if (pc->merge_type == MERGE_TYPE_STRLIST) {
1241 hal_device_property_strlist_prepend (pc->device, pc->merge_key, pc->cdata_buf);
1245 switch (pc->merge_type) {
1247 strncpy (buf, pc->cdata_buf, sizeof (buf));
1251 hal_device_property_get_as_string (pc->device, pc->cdata_buf, buf, sizeof (buf));
1255 HAL_ERROR (("Unknown merge_type=%d='%c'", pc->merge_type, pc->merge_type));
1259 existing_string = hal_device_property_get_string (pc->device, pc->merge_key);
1266 hal_device_property_set_string (pc->device, pc->merge_key, buf2);
1268 } else if (pc->curelem == CURELEM_REMOVE && pc->match_ok) {
1270 if (pc->merge_type == MERGE_TYPE_STRLIST) {
1272 hal_device_property_strlist_remove (pc->device, pc->merge_key, pc->cdata_buf);
1275 if (strlen (pc->cdata_buf) == 0) {
1276 hal_device_property_remove (pc->device, pc->merge_key);
1279 } else if (pc->merge_type == MERGE_TYPE_SPAWN) {
1282 spawned = hal_device_store_find (hald_get_gdl (), pc->merge_key);
1284 spawned = hal_device_store_find (hald_get_tdl (), pc->merge_key);
1288 pc->merge_key, pc->device->udi));
1292 hal_device_property_set_string (spawned, "info.udi", pc->merge_key);
1293 hal_device_property_set_string (spawned, "info.parent", pc->device->udi);
1294 hal_device_set_udi (spawned, pc->merge_key);
1304 } else if (pc->curelem == CURELEM_CLEAR && pc->match_ok) {
1305 if (pc->merge_type == MERGE_TYPE_CLEAR) {
1306 hal_device_property_strlist_clear (pc->device, pc->merge_key);
1311 pc->cdata_buf_len = 0;
1312 pc->depth--;
1315 pc->curelem = pc->curelem_stack[pc->depth];
1317 /* maintain pc->match_ok */
1318 if (pc->depth <= pc->match_depth_first_fail)
1319 pc->match_ok = TRUE;
1324 * @param pc Parsing context
1329 cdata (ParsingContext * pc, const char *s, int len)
1334 if (pc->aborted)
1337 bytes_left = CDATA_BUF_SIZE - pc->cdata_buf_len;
1348 memcpy (pc->cdata_buf + pc->cdata_buf_len, s,
1351 pc->cdata_buf_len += bytes_to_copy;