⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diff_file.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
{  svn_diff__file_output_baton_t baton;  int i;  if (svn_diff_contains_diffs(diff))    {      memset(&baton, 0, sizeof(baton));      baton.output_stream = output_stream;      baton.pool = pool;      baton.header_encoding = header_encoding;      baton.path[0] = original_path;      baton.path[1] = modified_path;      baton.hunk = svn_stringbuf_create("", pool);      SVN_ERR(svn_utf_cstring_from_utf8_ex2(&baton.context_str, " ",                                            header_encoding, pool));      SVN_ERR(svn_utf_cstring_from_utf8_ex2(&baton.delete_str, "-",                                            header_encoding, pool));      SVN_ERR(svn_utf_cstring_from_utf8_ex2(&baton.insert_str, "+",                                            header_encoding, pool));            for (i = 0; i < 2; i++)        {          SVN_ERR(svn_io_file_open(&baton.file[i], baton.path[i],                                   APR_READ, APR_OS_DEFAULT, pool));        }      if (original_header == NULL)        {          SVN_ERR(svn_diff__file_output_unified_default_hdr                  (&original_header, original_path, pool));        }      if (modified_header == NULL)        {          SVN_ERR(svn_diff__file_output_unified_default_hdr                  (&modified_header, modified_path, pool));        }      SVN_ERR(svn_stream_printf_from_utf8(output_stream, header_encoding, pool,                                          "--- %s" APR_EOL_STR                                          "+++ %s" APR_EOL_STR,                                          original_header, modified_header));      SVN_ERR(svn_diff_output(diff, &baton,                              &svn_diff__file_output_unified_vtable));      SVN_ERR(svn_diff__file_output_unified_flush_hunk(&baton));      for (i = 0; i < 2; i++)        {	  SVN_ERR(svn_io_file_close(baton.file[i], pool));        }    }  return SVN_NO_ERROR;}svn_error_t *svn_diff_file_output_unified(svn_stream_t *output_stream,                             svn_diff_t *diff,                             const char *original_path,                             const char *modified_path,                             const char *original_header,                             const char *modified_header,                             apr_pool_t *pool){  return svn_diff_file_output_unified2(output_stream, diff,                                       original_path, modified_path,                                       original_header, modified_header,                                       SVN_APR_LOCALE_CHARSET, pool);}/** Display diff3 **/typedef struct svn_diff3__file_output_baton_t{  svn_stream_t *output_stream;  const char *path[3];  apr_off_t   current_line[3];  char       *buffer[3];  char       *endp[3];  char       *curp[3];  /* The following four members are in the encoding used for the output. */  const char *conflict_modified;  const char *conflict_original;  const char *conflict_separator;  const char *conflict_latest;  svn_boolean_t display_original_in_conflict;  svn_boolean_t display_resolved_conflicts;  apr_pool_t *pool;} svn_diff3__file_output_baton_t;typedef enum svn_diff3__file_output_type_e{  svn_diff3__file_output_skip,  svn_diff3__file_output_normal} svn_diff3__file_output_type_e;static svn_error_t *svn_diff3__file_output_line(svn_diff3__file_output_baton_t *baton,                            svn_diff3__file_output_type_e type,                            int idx){  char *curp;  char *endp;  char *eol;  apr_size_t len;  curp = baton->curp[idx];  endp = baton->endp[idx];  /* Lazily update the current line even if we're at EOF.   */  baton->current_line[idx]++;  if (curp == endp)    return SVN_NO_ERROR;  eol = find_eol_start(curp, endp - curp);  if (!eol)    eol = endp;  else    {      svn_boolean_t had_cr = (*eol == '\r');      eol++;      if (had_cr && eol != endp && *eol == '\n')        eol++;    }  if (type != svn_diff3__file_output_skip)    {      len = eol - curp;      SVN_ERR(svn_stream_write(baton->output_stream, curp, &len));    }  baton->curp[idx] = eol;  return SVN_NO_ERROR;}static svn_error_t *svn_diff3__file_output_hunk(void *baton,  int idx,  apr_off_t target_line, apr_off_t target_length){  svn_diff3__file_output_baton_t *output_baton = baton;  /* Skip lines until we are at the start of the changed range */  while (output_baton->current_line[idx] < target_line)    {      SVN_ERR(svn_diff3__file_output_line(output_baton,                                          svn_diff3__file_output_skip, idx));    }  target_line += target_length;  while (output_baton->current_line[idx] < target_line)    {      SVN_ERR(svn_diff3__file_output_line(output_baton,                                          svn_diff3__file_output_normal, idx));    }  return SVN_NO_ERROR;}static svn_error_t *svn_diff3__file_output_common(void *baton,  apr_off_t original_start, apr_off_t original_length,  apr_off_t modified_start, apr_off_t modified_length,  apr_off_t latest_start, apr_off_t latest_length){  return svn_diff3__file_output_hunk(baton, 1,                                     modified_start, modified_length);}static svn_error_t *svn_diff3__file_output_diff_modified(void *baton,  apr_off_t original_start, apr_off_t original_length,  apr_off_t modified_start, apr_off_t modified_length,  apr_off_t latest_start, apr_off_t latest_length){  return svn_diff3__file_output_hunk(baton, 1,                                     modified_start, modified_length);}static svn_error_t *svn_diff3__file_output_diff_latest(void *baton,  apr_off_t original_start, apr_off_t original_length,  apr_off_t modified_start, apr_off_t modified_length,  apr_off_t latest_start, apr_off_t latest_length){  return svn_diff3__file_output_hunk(baton, 2,                                     latest_start, latest_length);}static svn_error_t *svn_diff3__file_output_conflict(void *baton,  apr_off_t original_start, apr_off_t original_length,  apr_off_t modified_start, apr_off_t modified_length,  apr_off_t latest_start, apr_off_t latest_length,  svn_diff_t *diff);static const svn_diff_output_fns_t svn_diff3__file_output_vtable ={  svn_diff3__file_output_common,  svn_diff3__file_output_diff_modified,  svn_diff3__file_output_diff_latest,  svn_diff3__file_output_diff_modified, /* output_diff_common */  svn_diff3__file_output_conflict};static svn_error_t *svn_diff3__file_output_conflict(void *baton,  apr_off_t original_start, apr_off_t original_length,  apr_off_t modified_start, apr_off_t modified_length,  apr_off_t latest_start, apr_off_t latest_length,  svn_diff_t *diff){  svn_diff3__file_output_baton_t *file_baton = baton;  apr_size_t len;  if (diff && file_baton->display_resolved_conflicts)    {      return svn_diff_output(diff, baton,                             &svn_diff3__file_output_vtable);    }  len = strlen(file_baton->conflict_modified);  SVN_ERR(svn_stream_write(file_baton->output_stream,                           file_baton->conflict_modified,                           &len));  SVN_ERR(svn_diff3__file_output_hunk(baton, 1,                                      modified_start, modified_length));  if (file_baton->display_original_in_conflict)    {      len = strlen(file_baton->conflict_original);      SVN_ERR(svn_stream_write(file_baton->output_stream,                               file_baton->conflict_original, &len));      SVN_ERR(svn_diff3__file_output_hunk(baton, 0,                                          original_start, original_length));    }  len = strlen(file_baton->conflict_separator);  SVN_ERR(svn_stream_write(file_baton->output_stream,                           file_baton->conflict_separator, &len));  SVN_ERR(svn_diff3__file_output_hunk(baton, 2,                                      latest_start, latest_length));  len = strlen(file_baton->conflict_latest);  SVN_ERR(svn_stream_write(file_baton->output_stream,                           file_baton->conflict_latest, &len));  return SVN_NO_ERROR;}/* Return the first eol marker found in [BUF, ENDP) as a * NUL-terminated string, or NULL if no eol marker is found. * * If the last valid character of BUF is the first byte of a * potentially two-byte eol sequence, just return "\r", that is, * assume BUF represents a CR-only file.  This is correct for callers * that pass an entire file at once, and is no more likely to be * incorrect than correct for any caller that doesn't. */static const char *detect_eol(char *buf, char *endp){  const char *eol = find_eol_start(buf, endp - buf);  if (eol)    {      if (*eol == '\n')        return "\n";      /* We found a CR. */      ++eol;      if (eol == endp || *eol != '\n')        return "\r";      return "\r\n";    }  return NULL;}svn_error_t *svn_diff_file_output_merge(svn_stream_t *output_stream,                           svn_diff_t *diff,                           const char *original_path,                           const char *modified_path,                           const char *latest_path,                           const char *conflict_original,                           const char *conflict_modified,                           const char *conflict_latest,                           const char *conflict_separator,                           svn_boolean_t display_original_in_conflict,                           svn_boolean_t display_resolved_conflicts,                           apr_pool_t *pool){  svn_diff3__file_output_baton_t baton;  apr_file_t *file[3];  apr_off_t size;  int idx;#if APR_HAS_MMAP  apr_mmap_t *mm[3] = { 0 };#endif /* APR_HAS_MMAP */  const char *eol;  memset(&baton, 0, sizeof(baton));  baton.output_stream = output_stream;  baton.pool = pool;  baton.path[0] = original_path;  baton.path[1] = modified_path;  baton.path[2] = latest_path;  SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_modified,                                    conflict_modified ? conflict_modified                                    : apr_psprintf(pool, "<<<<<<< %s",                                                   modified_path),                                    pool));  SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_original,                                    conflict_original ? conflict_original                                    : apr_psprintf(pool, "||||||| %s",                                                   original_path),                                    pool));  SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_separator,                                    conflict_separator ? conflict_separator                                    : "=======", pool));  SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_latest,                                    conflict_latest ? conflict_latest                                    : apr_psprintf(pool, ">>>>>>> %s",                                                   latest_path),                                    pool));  baton.display_original_in_conflict = display_original_in_conflict;  baton.display_resolved_conflicts = display_resolved_conflicts &&                                     !display_original_in_conflict;  for (idx = 0; idx < 3; idx++)    {      SVN_ERR(map_or_read_file(&file[idx],                               MMAP_T_ARG(mm[idx])                               &baton.buffer[idx], &size,                               baton.path[idx], pool));      baton.curp[idx] = baton.buffer[idx];      baton.endp[idx] = baton.buffer[idx];      if (baton.endp[idx])        baton.endp[idx] += size;    }  /* Check what eol marker we should use for conflict markers.     We use the eol marker of the modified file and fall back on the     platform's eol marker if that file doesn't contain any newlines. */  eol = detect_eol(baton.buffer[1], baton.endp[1]);  if (! eol)    eol = APR_EOL_STR;  /* Extend our conflict markers with the correct eol marker. */  baton.conflict_modified = apr_pstrcat(pool, baton.conflict_modified, eol,                                        NULL);  baton.conflict_original = apr_pstrcat(pool, baton.conflict_original, eol,                                        NULL);  baton.conflict_separator = apr_pstrcat(pool, baton.conflict_separator, eol,                                         NULL);  baton.conflict_latest = apr_pstrcat(pool, baton.conflict_latest, eol,                                      NULL);  SVN_ERR(svn_diff_output(diff, &baton,                          &svn_diff3__file_output_vtable));  for (idx = 0; idx < 3; idx++)    {#if APR_HAS_MMAP      if (mm[idx])        {          apr_status_t rv = apr_mmap_delete(mm[idx]);          if (rv != APR_SUCCESS)            {              return svn_error_wrap_apr(rv, _("Failed to delete mmap '%s'"),                                        baton.path[idx]);            }        }#endif /* APR_HAS_MMAP */      if (file[idx])        {          SVN_ERR(svn_io_file_close(file[idx], pool));        }    }  return SVN_NO_ERROR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -