| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. | 2 * Copyright (C) 2010 Google Inc. |
| 3 * | 3 * |
| 4 * This program is free software; you can redistribute it and/or | 4 * This program is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU General Public License | 5 * modify it under the terms of the GNU General Public License |
| 6 * as published by the Free Software Foundation; either version 2 | 6 * as published by the Free Software Foundation; either version 2 |
| 7 * of the License, or (at your option) any later version. | 7 * of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 struct StringPair *found; | 277 struct StringPair *found; |
| 278 | 278 |
| 279 found = findString(container, key); | 279 found = findString(container, key); |
| 280 if (found) { | 280 if (found) { |
| 281 free(found->key); | 281 free(found->key); |
| 282 free(found->value); | 282 free(found->value); |
| 283 fillStringPair(found, key, value, pad_len); | 283 fillStringPair(found, key, value, pad_len); |
| 284 } else { | 284 } else { |
| 285 struct StringPair *new_pair = malloc(sizeof(struct StringPair)); | 285 struct StringPair *new_pair = malloc(sizeof(struct StringPair)); |
| 286 assert(new_pair); | 286 assert(new_pair); |
| 287 memset(new_pair, 0, sizeof(struct StringPair)); |
| 287 | 288 |
| 288 fillStringPair(new_pair, key, value, pad_len); | 289 fillStringPair(new_pair, key, value, pad_len); |
| 289 | 290 |
| 290 /* append this pair to the end of list. to keep the order */ | 291 /* append this pair to the end of list. to keep the order */ |
| 291 if (found = container->first) { | 292 if (found = container->first) { |
| 292 while (found->next) found = found->next; | 293 while (found->next) found = found->next; |
| 293 found->next = new_pair; | 294 found->next = new_pair; |
| 294 } else { | 295 } else { |
| 295 container->first = new_pair; | 296 container->first = new_pair; |
| 296 } | 297 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 322 current->pad_len, | 323 current->pad_len, |
| 323 max_buf_len, | 324 max_buf_len, |
| 324 buf, | 325 buf, |
| 325 generated)) { | 326 generated)) { |
| 326 return VPD_FAIL; | 327 return VPD_FAIL; |
| 327 } | 328 } |
| 328 } | 329 } |
| 329 return VPD_OK; | 330 return VPD_OK; |
| 330 } | 331 } |
| 331 | 332 |
| 333 int setContainerFilter(struct PairContainer *container, |
| 334 const uint8_t *filter) { |
| 335 struct StringPair *str; |
| 336 |
| 337 for (str = container->first; str; str = str->next) { |
| 338 if (filter) { |
| 339 /* |
| 340 * TODO(yjlou): |
| 341 * Now, we treat the inputing filter string as plain string. |
| 342 * Will support regular expression syntax in future if needed. |
| 343 */ |
| 344 if (strcmp(str->key, filter)) { |
| 345 str->filter_out = 1; |
| 346 } |
| 347 } else { |
| 348 str->filter_out = 0; |
| 349 } |
| 350 } |
| 351 return VPD_OK; |
| 352 } |
| 353 |
| 332 /* Export the container content with human-readable text. */ | 354 /* Export the container content with human-readable text. */ |
| 333 int exportContainer(const int export_type, | 355 int exportContainer(const int export_type, |
| 334 const struct PairContainer *container, | 356 const struct PairContainer *container, |
| 335 const int max_buf_len, | 357 const int max_buf_len, |
| 336 uint8_t *buf, | 358 uint8_t *buf, |
| 337 int *generated) { | 359 int *generated) { |
| 338 struct StringPair *str; | 360 struct StringPair *str; |
| 339 int index; | 361 int index; |
| 340 | 362 |
| 341 assert(generated); | 363 assert(generated); |
| 342 index = *generated; | 364 index = *generated; |
| 343 | 365 |
| 344 for (str = container->first; str; str = str->next) { | 366 for (str = container->first; str; str = str->next) { |
| 345 int copy_len; | 367 int copy_len; |
| 346 | 368 |
| 369 if (str->filter_out) |
| 370 continue; |
| 371 |
| 347 if (export_type == VPD_EXPORT_AS_PARAMETER) { | 372 if (export_type == VPD_EXPORT_AS_PARAMETER) { |
| 348 char pad_str[32]; | 373 char pad_str[32]; |
| 349 int pad_len; | 374 int pad_len; |
| 350 | 375 |
| 351 snprintf(pad_str, sizeof(pad_str), "-p %d -s ", str->pad_len); | 376 snprintf(pad_str, sizeof(pad_str), "-p %d -s ", str->pad_len); |
| 352 pad_len = strlen(pad_str); | 377 pad_len = strlen(pad_str); |
| 353 if ((index + pad_len) > max_buf_len) return VPD_FAIL; | 378 if ((index + pad_len) > max_buf_len) return VPD_FAIL; |
| 354 strcpy(&buf[index], pad_str); | 379 strcpy(&buf[index], pad_str); |
| 355 index += pad_len; | 380 index += pad_len; |
| 356 } | 381 } |
| 357 | 382 |
| 358 /* double quote */ | 383 if (export_type != VPD_EXPORT_VALUE) { |
| 359 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 384 /* double quote */ |
| 360 buf[index++] = '"'; | 385 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 386 buf[index++] = '"'; |
| 361 | 387 |
| 362 /* output key */ | 388 /* output key */ |
| 363 if ((index + strlen(str->key)) > max_buf_len) return VPD_FAIL; | 389 if ((index + strlen(str->key)) > max_buf_len) return VPD_FAIL; |
| 364 strcpy(&buf[index], str->key); | 390 strcpy(&buf[index], str->key); |
| 365 index += strlen(str->key); | 391 index += strlen(str->key); |
| 366 | 392 |
| 367 /* double quote */ | 393 /* double quote */ |
| 368 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 394 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 369 buf[index++] = '"'; | 395 buf[index++] = '"'; |
| 370 | 396 |
| 371 /* equal sign */ | 397 /* equal sign */ |
| 372 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 398 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 373 buf[index++] = '='; | 399 buf[index++] = '='; |
| 374 | 400 |
| 375 /* double quote */ | 401 /* double quote */ |
| 376 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 402 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 377 buf[index++] = '"'; | 403 buf[index++] = '"'; |
| 404 } |
| 378 | 405 |
| 379 /* output value */ | 406 /* output value */ |
| 380 if (str->pad_len != VPD_AS_LONG_AS) | 407 if (str->pad_len != VPD_AS_LONG_AS) |
| 381 copy_len = MIN(str->pad_len, strlen(str->value)); | 408 copy_len = MIN(str->pad_len, strlen(str->value)); |
| 382 else | 409 else |
| 383 copy_len = strlen(str->value); | 410 copy_len = strlen(str->value); |
| 384 if ((index + copy_len) > max_buf_len) return VPD_FAIL; | 411 if ((index + copy_len) > max_buf_len) return VPD_FAIL; |
| 385 memcpy(&buf[index], str->value, copy_len); | 412 memcpy(&buf[index], str->value, copy_len); |
| 386 index += copy_len; | 413 index += copy_len; |
| 387 | 414 |
| 388 /* double quote */ | 415 if (export_type != VPD_EXPORT_VALUE) { |
| 389 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 416 /* double quote */ |
| 390 buf[index++] = '"'; | 417 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 418 buf[index++] = '"'; |
| 391 | 419 |
| 392 /* new line */ | 420 /* new line */ |
| 393 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 421 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 394 buf[index++] = '\n'; | 422 buf[index++] = '\n'; |
| 423 } |
| 395 } | 424 } |
| 396 | 425 |
| 397 /* null terminator */ | 426 /* null terminator */ |
| 398 if ((index + 1 > max_buf_len)) return VPD_FAIL; | 427 if ((index + 1 > max_buf_len)) return VPD_FAIL; |
| 399 buf[index++] = '\0'; | 428 buf[index++] = '\0'; |
| 400 | 429 |
| 401 *generated = index; | 430 *generated = index; |
| 402 | 431 |
| 403 return VPD_OK; | 432 return VPD_OK; |
| 404 } | 433 } |
| 405 | 434 |
| 406 void destroyContainer(struct PairContainer *container) { | 435 void destroyContainer(struct PairContainer *container) { |
| 407 struct StringPair *current; | 436 struct StringPair *current; |
| 408 | 437 |
| 409 for (current = container->first; current;) { | 438 for (current = container->first; current;) { |
| 410 struct StringPair *next; | 439 struct StringPair *next; |
| 411 | 440 |
| 412 if (current->key) free(current->key); | 441 if (current->key) free(current->key); |
| 413 if (current->value) free(current->value); | 442 if (current->value) free(current->value); |
| 414 next = current->next; | 443 next = current->next; |
| 415 free(current); | 444 free(current); |
| 416 current = next; | 445 current = next; |
| 417 } | 446 } |
| 418 } | 447 } |
| OLD | NEW |