Zvikomborero VIncent Zvikaramba | 5b852f6 | 2016-07-22 01:37:09 -0400 | [diff] [blame] | 1 | /* Copyright (c) 2014, The Linux Foundation. All rights reserved. |
| 2 | * |
| 3 | * Redistribution and use in source and binary forms, with or without |
| 4 | * modification, are permitted provided that the following conditions are |
| 5 | * met: |
| 6 | * * Redistributions of source code must retain the above copyright |
| 7 | * notice, this list of conditions and the following disclaimer. |
| 8 | * * Redistributions in binary form must reproduce the above |
| 9 | * copyright notice, this list of conditions and the following |
| 10 | * disclaimer in the documentation and/or other materials provided |
| 11 | * with the distribution. |
| 12 | * * Neither the name of The Linux Foundation, nor the names of its |
| 13 | * contributors may be used to endorse or promote products derived |
| 14 | * from this software without specific prior written permission. |
| 15 | * |
| 16 | * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| 17 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| 18 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| 20 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| 23 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| 24 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| 25 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| 26 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | * |
| 28 | */ |
| 29 | #include <stdio.h> |
| 30 | #include <string.h> |
| 31 | #include <log_util.h> |
| 32 | #include <loc_misc_utils.h> |
| 33 | #include <ctype.h> |
| 34 | |
| 35 | #define LOG_NDDEBUG 0 |
| 36 | #define LOG_TAG "LocSvc_misc_utils" |
| 37 | |
| 38 | int loc_util_split_string(char *raw_string, char **split_strings_ptr, |
| 39 | int max_num_substrings, char delimiter) |
| 40 | { |
| 41 | int raw_string_index=0; |
| 42 | int num_split_strings=0; |
| 43 | unsigned char end_string=0; |
| 44 | int raw_string_length=0; |
| 45 | |
| 46 | if(!raw_string || !split_strings_ptr) { |
| 47 | LOC_LOGE("%s:%d]: NULL parameters", __func__, __LINE__); |
| 48 | num_split_strings = -1; |
| 49 | goto err; |
| 50 | } |
| 51 | LOC_LOGD("%s:%d]: raw string: %s\n", __func__, __LINE__, raw_string); |
| 52 | raw_string_length = strlen(raw_string) + 1; |
| 53 | split_strings_ptr[num_split_strings] = &raw_string[raw_string_index]; |
| 54 | for(raw_string_index=0; raw_string_index < raw_string_length; raw_string_index++) { |
| 55 | if(raw_string[raw_string_index] == '\0') |
| 56 | end_string=1; |
| 57 | if((raw_string[raw_string_index] == delimiter) || end_string) { |
| 58 | raw_string[raw_string_index] = '\0'; |
| 59 | LOC_LOGD("%s:%d]: split string: %s\n", |
| 60 | __func__, __LINE__, split_strings_ptr[num_split_strings]); |
| 61 | num_split_strings++; |
| 62 | if(((raw_string_index + 1) < raw_string_length) && |
| 63 | (num_split_strings < max_num_substrings)) { |
| 64 | split_strings_ptr[num_split_strings] = &raw_string[raw_string_index+1]; |
| 65 | } |
| 66 | else { |
| 67 | break; |
| 68 | } |
| 69 | } |
| 70 | if(end_string) |
| 71 | break; |
| 72 | } |
| 73 | err: |
| 74 | LOC_LOGD("%s:%d]: num_split_strings: %d\n", __func__, __LINE__, num_split_strings); |
| 75 | return num_split_strings; |
| 76 | } |
| 77 | |
| 78 | void loc_util_trim_space(char *org_string) |
| 79 | { |
| 80 | char *scan_ptr, *write_ptr; |
| 81 | char *first_nonspace = NULL, *last_nonspace = NULL; |
| 82 | |
| 83 | if(org_string == NULL) { |
| 84 | LOC_LOGE("%s:%d]: NULL parameter", __func__, __LINE__); |
| 85 | goto err; |
| 86 | } |
| 87 | |
| 88 | scan_ptr = write_ptr = org_string; |
| 89 | |
| 90 | while (*scan_ptr) { |
| 91 | //Find the first non-space character |
| 92 | if ( !isspace(*scan_ptr) && first_nonspace == NULL) { |
| 93 | first_nonspace = scan_ptr; |
| 94 | } |
| 95 | //Once the first non-space character is found in the |
| 96 | //above check, keep shifting the characters to the left |
| 97 | //to replace the spaces |
| 98 | if (first_nonspace != NULL) { |
| 99 | *(write_ptr++) = *scan_ptr; |
| 100 | //Keep track of which was the last non-space character |
| 101 | //encountered |
| 102 | //last_nonspace will not be updated in the case where |
| 103 | //the string ends with spaces |
| 104 | if ( !isspace(*scan_ptr)) { |
| 105 | last_nonspace = write_ptr; |
| 106 | } |
| 107 | } |
| 108 | scan_ptr++; |
| 109 | } |
| 110 | //Add NULL terminator after the last non-space character |
| 111 | if (last_nonspace) { *last_nonspace = '\0'; } |
| 112 | err: |
| 113 | return; |
| 114 | } |