Diff for /parser3/src/main/pa_common.C between versions 1.319 and 1.327

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;

Removed from v.1.319  
changed lines
  Added in v.1.327


E-mail: