aboutsummaryrefslogtreecommitdiff
path: root/libbb/read_package_field.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/read_package_field.c')
-rw-r--r--libbb/read_package_field.c101
1 files changed, 0 insertions, 101 deletions
diff --git a/libbb/read_package_field.c b/libbb/read_package_field.c
deleted file mode 100644
index 9e5590347..000000000
--- a/libbb/read_package_field.c
+++ /dev/null
@@ -1,101 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) many different people.
6 * If you wrote this, please acknowledge your work.
7 *
8 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
9 */
10
11#include <stdlib.h>
12#include <string.h>
13#include "libbb.h"
14
15/*
16 * Gets the next package field from package_buffer, seperated into the field name
17 * and field value, it returns the int offset to the first character of the next field
18 */
19int read_package_field(const char *package_buffer, char **field_name, char **field_value)
20{
21 int offset_name_start = 0;
22 int offset_name_end = 0;
23 int offset_value_start = 0;
24 int offset_value_end = 0;
25 int offset = 0;
26 int next_offset;
27 int name_length;
28 int value_length;
29 int exit_flag = FALSE;
30
31 if (package_buffer == NULL) {
32 *field_name = NULL;
33 *field_value = NULL;
34 return(-1);
35 }
36 while (1) {
37 next_offset = offset + 1;
38 switch (package_buffer[offset]) {
39 case('\0'):
40 exit_flag = TRUE;
41 break;
42 case(':'):
43 if (offset_name_end == 0) {
44 offset_name_end = offset;
45 offset_value_start = next_offset;
46 }
47 /* TODO: Name might still have trailing spaces if ':' isnt
48 * immediately after name */
49 break;
50 case('\n'):
51 /* TODO: The char next_offset may be out of bounds */
52 if (package_buffer[next_offset] != ' ') {
53 exit_flag = TRUE;
54 break;
55 }
56 case('\t'):
57 case(' '):
58 /* increment the value start point if its a just filler */
59 if (offset_name_start == offset) {
60 offset_name_start++;
61 }
62 if (offset_value_start == offset) {
63 offset_value_start++;
64 }
65 break;
66 }
67 if (exit_flag) {
68 /* Check that the names are valid */
69 offset_value_end = offset;
70 name_length = offset_name_end - offset_name_start;
71 value_length = offset_value_end - offset_value_start;
72 if (name_length == 0) {
73 break;
74 }
75 if ((name_length > 0) && (value_length > 0)) {
76 break;
77 }
78
79 /* If not valid, start fresh with next field */
80 exit_flag = FALSE;
81 offset_name_start = offset + 1;
82 offset_name_end = 0;
83 offset_value_start = offset + 1;
84 offset_value_end = offset + 1;
85 offset++;
86 }
87 offset++;
88 }
89 if (name_length == 0) {
90 *field_name = NULL;
91 } else {
92 *field_name = bb_xstrndup(&package_buffer[offset_name_start], name_length);
93 }
94 if (value_length > 0) {
95 *field_value = bb_xstrndup(&package_buffer[offset_value_start], value_length);
96 } else {
97 *field_value = NULL;
98 }
99 return(next_offset);
100}
101