/[LeafOK_CVS]/lbbs/src/io.c
ViewVC logotype

Diff of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.68 by sysadm, Mon Nov 17 10:57:23 2025 UTC Revision 1.71 by sysadm, Sun Nov 23 06:43:51 2025 UTC
# Line 1034  int io_buf_conv(iconv_t cd, char *p_buf, Line 1034  int io_buf_conv(iconv_t cd, char *p_buf,
1034          int ret;          int ret;
1035          int in_control = 0;          int in_control = 0;
1036          size_t i = 0;          size_t i = 0;
1037            int skip_current = 0;
1038    
1039          if (cd == NULL || p_buf == NULL || p_buf_len == NULL || p_buf_offset == NULL || p_conv == NULL || p_conv_len == NULL)          if (cd == NULL || p_buf == NULL || p_buf_len == NULL || p_buf_offset == NULL || p_conv == NULL || p_conv_len == NULL)
1040          {          {
# Line 1057  int io_buf_conv(iconv_t cd, char *p_buf, Line 1058  int io_buf_conv(iconv_t cd, char *p_buf,
1058                          }                          }
1059                  }                  }
1060    
1061                  if (in_control)                  if (in_control || skip_current)
1062                  {                  {
1063                            skip_current = 0;
1064    
1065                          if (out_bytes <= 0)                          if (out_bytes <= 0)
1066                          {                          {
1067                                  log_error("No enough free space in p_conv, conv_len=%d, conv_size=%d\n", *p_conv_len, conv_size);                                  log_error("No enough free space in p_conv, conv_len=%d, conv_size=%d\n", *p_conv_len, conv_size);
# Line 1072  int io_buf_conv(iconv_t cd, char *p_buf, Line 1075  int io_buf_conv(iconv_t cd, char *p_buf,
1075                          out_bytes--;                          out_bytes--;
1076    
1077                          (*p_buf_offset)++;                          (*p_buf_offset)++;
1078                          *p_conv_len = (int)(conv_size - out_bytes);                          (*p_conv_len)++;
1079    
1080                          i++;                          i++;
1081                          if (i >= 2)                          if (i >= 2)
# Line 1092  int io_buf_conv(iconv_t cd, char *p_buf, Line 1095  int io_buf_conv(iconv_t cd, char *p_buf,
1095  #endif  #endif
1096                                  if (p_buf != in_buf)                                  if (p_buf != in_buf)
1097                                  {                                  {
1098                                          *p_buf_len = (int)(p_buf + *p_buf_len - in_buf);                                          *p_buf_len -= (int)(in_buf - p_buf);
1099                                          *p_buf_offset = 0;                                          *p_buf_offset = 0;
1100                                          *p_conv_len = (int)(conv_size - out_bytes);                                          *p_conv_len = (int)(conv_size - out_bytes);
1101                                          memmove(p_buf, in_buf, (size_t)(*p_buf_len));                                          memmove(p_buf, in_buf, (size_t)(*p_buf_len));
# Line 1117  int io_buf_conv(iconv_t cd, char *p_buf, Line 1120  int io_buf_conv(iconv_t cd, char *p_buf,
1120                                  if (in_bytes == 0)                                  if (in_bytes == 0)
1121                                  {                                  {
1122                                          in_bytes = (size_t)(*p_buf_len - *p_buf_offset);                                          in_bytes = (size_t)(*p_buf_len - *p_buf_offset);
1123    #ifdef _DEBUG
1124                                            log_error("Reset in_bytes from 0 to %d\n", in_bytes);
1125    #endif
1126                                  }                                  }
1127    
1128                                  *out_buf = *in_buf;  #ifdef _DEBUG
1129                                  in_buf++;                                  log_error("iconv(in_bytes=%d, out_bytes=%d) error: EILSEQ, in_buf[0]=%d\n",
1130                                  out_buf++;                                                    in_bytes, out_bytes, in_buf[0]);
1131                                  in_bytes--;  #endif
1132                                  out_bytes--;                                  skip_current = 1;
1133                            }
1134                                  continue;                          else // something strange
1135                            {
1136    #ifdef _DEBUG
1137                                    log_error("iconv(in_bytes=%d, out_bytes=%d) error: %d, in_buf[0]=%d\n",
1138                                                      in_bytes, out_bytes, errno, in_buf[0]);
1139    #endif
1140                                    *p_buf_offset = (int)(in_buf - p_buf);
1141                                    *p_conv_len = (int)(conv_size - out_bytes);
1142                                    skip_current = 1;
1143                          }                          }
1144                  }                  }
1145                  else                  else
1146                  {                  {
1147                          *p_buf_len = 0;                          *p_buf_offset = (int)(in_buf - p_buf);
                         *p_buf_offset = 0;  
1148                          *p_conv_len = (int)(conv_size - out_bytes);                          *p_conv_len = (int)(conv_size - out_bytes);
   
                         break;  
1149                  }                  }
1150          }          }
1151    
1152            if (*p_buf_offset >= *p_buf_len)
1153            {
1154                    *p_buf_len = 0;
1155                    *p_buf_offset = 0;
1156            }
1157    
1158          return 0;          return 0;
1159  }  }
1160    


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1