• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //
18 // Miscellaneous utility functions.
19 //
20 #include <utils/misc.h>
21 
22 #include <sys/stat.h>
23 #include <string.h>
24 #include <errno.h>
25 #include <assert.h>
26 #include <stdio.h>
27 
28 using namespace android;
29 
30 namespace android {
31 
32 /*
33  * Like strdup(), but uses C++ "new" operator instead of malloc.
34  */
strdupNew(const char * str)35 char* strdupNew(const char* str)
36 {
37     char* newStr;
38     int len;
39 
40     if (str == NULL)
41         return NULL;
42 
43     len = strlen(str);
44     newStr = new char[len+1];
45     memcpy(newStr, str, len+1);
46 
47     return newStr;
48 }
49 
50 /*
51  * Concatenate an argument vector.
52  */
concatArgv(int argc,const char * const argv[])53 char* concatArgv(int argc, const char* const argv[])
54 {
55     char* newStr = NULL;
56     int len, totalLen, posn, idx;
57 
58     /*
59      * First, figure out the total length.
60      */
61     totalLen = idx = 0;
62     while (1) {
63         if (idx == argc || argv[idx] == NULL)
64             break;
65         if (idx)
66             totalLen++;  // leave a space between args
67         totalLen += strlen(argv[idx]);
68         idx++;
69     }
70 
71     /*
72      * Alloc the string.
73      */
74     newStr = new char[totalLen +1];
75     if (newStr == NULL)
76         return NULL;
77 
78     /*
79      * Finally, allocate the string and copy data over.
80      */
81     idx = posn = 0;
82     while (1) {
83         if (idx == argc || argv[idx] == NULL)
84             break;
85         if (idx)
86             newStr[posn++] = ' ';
87 
88         len = strlen(argv[idx]);
89         memcpy(&newStr[posn], argv[idx], len);
90         posn += len;
91 
92         idx++;
93     }
94 
95     assert(posn == totalLen);
96     newStr[posn] = '\0';
97 
98     return newStr;
99 }
100 
101 /*
102  * Count the #of args in an argument vector.  Don't count the final NULL.
103  */
countArgv(const char * const argv[])104 int countArgv(const char* const argv[])
105 {
106     int count = 0;
107 
108     while (argv[count] != NULL)
109         count++;
110 
111     return count;
112 }
113 
114 
115 #include <stdio.h>
116 /*
117  * Get a file's type.
118  */
getFileType(const char * fileName)119 FileType getFileType(const char* fileName)
120 {
121     struct stat sb;
122 
123     if (stat(fileName, &sb) < 0) {
124         if (errno == ENOENT || errno == ENOTDIR)
125             return kFileTypeNonexistent;
126         else {
127             fprintf(stderr, "getFileType got errno=%d on '%s'\n",
128                 errno, fileName);
129             return kFileTypeUnknown;
130         }
131     } else {
132         if (S_ISREG(sb.st_mode))
133             return kFileTypeRegular;
134         else if (S_ISDIR(sb.st_mode))
135             return kFileTypeDirectory;
136         else if (S_ISCHR(sb.st_mode))
137             return kFileTypeCharDev;
138         else if (S_ISBLK(sb.st_mode))
139             return kFileTypeBlockDev;
140         else if (S_ISFIFO(sb.st_mode))
141             return kFileTypeFifo;
142 #ifdef HAVE_SYMLINKS
143         else if (S_ISLNK(sb.st_mode))
144             return kFileTypeSymlink;
145         else if (S_ISSOCK(sb.st_mode))
146             return kFileTypeSocket;
147 #endif
148         else
149             return kFileTypeUnknown;
150     }
151 }
152 
153 /*
154  * Get a file's modification date.
155  */
getFileModDate(const char * fileName)156 time_t getFileModDate(const char* fileName)
157 {
158     struct stat sb;
159 
160     if (stat(fileName, &sb) < 0)
161         return (time_t) -1;
162 
163     return sb.st_mtime;
164 }
165 
166 /*
167  * Round up to the next highest power of 2.
168  *
169  * Found on http://graphics.stanford.edu/~seander/bithacks.html.
170  */
roundUpPower2(unsigned int val)171 unsigned int roundUpPower2(unsigned int val)
172 {
173     val--;
174     val |= val >> 1;
175     val |= val >> 2;
176     val |= val >> 4;
177     val |= val >> 8;
178     val |= val >> 16;
179     val++;
180 
181     return val;
182 }
183 
184 }; // namespace android
185 
186