|
|
| version 1.319, 2020/12/02 20:23:05 | version 1.327, 2023/09/26 20:49:09 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: commonly functions. | Parser: commonly functions. |
| Copyright (c) 2000-2017 Art. Lebedev Studio (http://www.artlebedev.com) | Copyright (c) 2000-2023 Art. Lebedev Studio (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru> |
| */ | */ |
| #include "pa_common.h" | #include "pa_common.h" |
| Line 116 struct File_read_action_info { | Line 116 struct File_read_action_info { |
| static void file_read_action(struct stat& finfo, int f, const String& file_spec, void *context) { | static void file_read_action(struct stat& finfo, int f, const String& file_spec, void *context) { |
| File_read_action_info& info = *static_cast<File_read_action_info *>(context); | File_read_action_info& info = *static_cast<File_read_action_info *>(context); |
| size_t to_read_size = check_file_size(info.limit && info.limit < finfo.st_size ? info.limit : finfo.st_size, &file_spec); | size_t to_read_size = check_file_size(info.limit && info.limit < (size_t)finfo.st_size ? info.limit : (size_t)finfo.st_size, &file_spec); |
| if(to_read_size) { | if(to_read_size) { |
| if(info.offset && (uint64_t)pa_lseek(f, info.offset) != info.offset) | if(info.offset) |
| throw Exception("file.read", &file_spec, "seek to %.15g failed: %s (%d)", (double)info.offset, strerror(errno), errno); | pa_lseek(f, info.offset, SEEK_SET); // seek never fails as POSIX allows the file offset to be set beyond the EOF |
| *info.data = info.buf ? info.buf : (char *)pa_malloc_atomic(to_read_size+1); | *info.data = info.buf ? info.buf : (char *)pa_malloc_atomic(to_read_size+1); |
| ssize_t result = read(f, *info.data, to_read_size); | ssize_t result = read(f, *info.data, to_read_size); |
| if(result<0) | if(result<0) |
| Line 286 bool file_read_action_under_lock(const S | Line 286 bool file_read_action_under_lock(const S |
| } | } |
| void create_dir_for_file(const String& file_spec) { | void create_dir_for_file(const String& file_spec) { |
| size_t pos_after=1; | const char *str=file_spec.taint_cstr(String::L_FILE_SPEC); |
| size_t pos_before; | if(str[0]){ |
| while((pos_before=file_spec.pos('/', pos_after))!=STRING_NOT_FOUND) { | const char *pos=str+1; |
| pa_mkdir(file_spec.mid(0, pos_before).taint_cstr(String::L_FILE_SPEC), 0775); | while((pos=strchr(pos,'/')) && pos[1]) { // to avoid trailing /, see #1166 |
| pos_after=pos_before+1; | pa_mkdir(pa_strdup(str,pos-str), 0775); |
| pos++; | |
| } | |
| } | } |
| } | } |
| Line 564 const char* capitalize(const char* s){ | Line 566 const char* capitalize(const char* s){ |
| return (const char*)result; | return (const char*)result; |
| } | } |
| char *str_lower(const char *s, size_t helper_length){ | char *str_lower(const char *s, size_t length){ |
| char *result=pa_strdup(s, helper_length); | char *result=pa_strdup(s, length); |
| for(char* c=result; *c; c++) | for(char* c=result; *c; c++) |
| *c=(char)tolower((unsigned char)*c); | *c=(char)tolower((unsigned char)*c); |
| return result; | return result; |
| } | } |
| char *str_upper(const char *s, size_t helper_length){ | char *str_upper(const char *s, size_t length){ |
| char *result=pa_strdup(s, helper_length); | char *result=pa_strdup(s, length); |
| for(char* c=result; *c; c++) | for(char* c=result; *c; c++) |
| *c=(char)toupper((unsigned char)*c); | *c=(char)toupper((unsigned char)*c); |
| return result; | return result; |
| Line 652 char* rsplit(char* string, char delim) { | Line 654 char* rsplit(char* string, char delim) { |
| return NULL; | return NULL; |
| } | } |
| void pa_strncpy(char *dst, const char *src, size_t n){ | |
| size_t left = n; | |
| if (left != 0 && src) { | |
| while (--left != 0) { | |
| if ((*dst++ = *src++) == '\0') | |
| return; | |
| } | |
| } | |
| if (n != 0) | |
| *dst = '\0'; | |
| } | |
| #define STRCAT_STEP(str, len) if(str) { memcpy(ptr, str, len); ptr += len; } | #define STRCAT_STEP(str, len) if(str) { memcpy(ptr, str, len); ptr += len; } |
| char *pa_strcat(const char *a, const char *b, const char *c) { | char *pa_strcat(const char *a, const char *b, const char *c) { |
| Line 897 size_t strpos(const char *str, const cha | Line 912 size_t strpos(const char *str, const cha |
| return (p==0)?STRING_NOT_FOUND:p-str; | return (p==0)?STRING_NOT_FOUND:p-str; |
| } | } |
| int remove_crlf(char* start, char* end) { | size_t remove_crlf(char* start, char* end) { |
| char* from=start; | char* from=start; |
| char* to=start; | char* to=start; |
| bool skip=false; | bool skip=false; |
| Line 943 const char* hex_string(unsigned char* by | Line 958 const char* hex_string(unsigned char* by |
| return bytes_hex; | return bytes_hex; |
| } | } |
| int file_block_read(const int f, unsigned char* buffer, const size_t size){ | ssize_t file_block_read(const int f, void* buffer, const size_t size){ |
| int nCount = read(f, buffer, size); | ssize_t nCount = read(f, buffer, size); |
| if (nCount < 0) | if (nCount < 0) |
| throw Exception("file.read", 0, "read failed: %s (%d)", strerror(errno), errno); | throw Exception("file.read", 0, "read failed: %s (%d)", strerror(errno), errno); |
| return nCount; | return nCount; |