/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /* Copyright 2013-2021 The Libfossil Authors, see LICENSES/BSD-2-Clause.txt SPDX-License-Identifier: BSD-2-Clause-FreeBSD SPDX-FileCopyrightText: 2021 The Libfossil Authors SPDX-ArtifactOfProjectName: Libfossil SPDX-FileType: Code Heavily indebted to the Fossil SCM project (https://fossil-scm.org). */ /** This is a test app for fsl_buffer_merge3(). */ #include "libfossil.h" // Only for testing/debugging.. #define MARKER(pfexp) \ do{ printf("MARKER: %s:%d:%s():\t",__FILE__,__LINE__,__func__); \ printf pfexp; \ } while(0) static int do_merge(const char *zPivot, const char *zV1, const char *zV2, FILE * out){ fsl_buffer bP = fsl_buffer_empty; fsl_buffer b1 = fsl_buffer_empty; fsl_buffer b2 = fsl_buffer_empty; fsl_buffer bOut = fsl_buffer_empty; int rc = 0; unsigned int conflictCount = 0; #define fill(B,N) rc = fsl_buffer_fill_from_filename(&B, N); \ if(rc) { rc = fcli_err_set(rc, "Cannot read file: %s\n", N); goto end; }(void)0 fill(bP, zPivot); fill(b1, zV1); fill(b2, zV2); #undef fill //MARKER(("Files loaded. Merging...\n")); rc = fsl_buffer_merge3(&bP, &b1, &b2, &bOut, &conflictCount); if(rc) goto end; fwrite(bOut.mem, bOut.used, 1, out); if(conflictCount){ f_out("WARNING: %u merge conflict(s)\n", conflictCount); assert(fsl_buffer_contains_merge_marker(&bOut)); }else{ assert(!fsl_buffer_contains_merge_marker(&bOut)); } end: fsl_buffer_clear(&bP); fsl_buffer_clear(&b1); fsl_buffer_clear(&b2); fsl_buffer_clear(&bOut); //MARKER(("rc=%s\n", fsl_rc_cstr(rc))); return rc; } int main(int argc, const char * const * argv ){ char const * zPivot; char const * zV1; char const * zV2; char const * zFOut = "-"; const fcli_cliflag FCliFlags[] = { FCLI_FLAG("o","outfile","filename",&zFOut, "Output file. Defaults to stdout."), fcli_cliflag_empty_m }; const fcli_help_info FCliHelp = { "A test app for fsl_buffer_merge3().", "pivotFile v1File v2File", NULL }; fcli.clientFlags.checkoutDir = NULL; int rc = fcli_setup_v2(argc, argv, FCliFlags, &FCliHelp); if(rc) goto end;; zPivot = fcli_next_arg(true); zV1 = fcli_next_arg(true); zV2 = fcli_next_arg(true); if(!zV2){ rc = fcli_err_set(FSL_RC_MISUSE, "Requires 3 input files: pivot v1 v2"); goto end; } if((rc=fcli_has_unused_args(false))) goto end; FILE * fOut = fsl_fopen(zFOut, "wb"); if(!fOut){ rc = fcli_err_set(FSL_RC_IO,"Cannot open output file: %s", zFOut); goto end; } rc = do_merge(zPivot, zV1, zV2, fOut); fsl_fclose(fOut); end: return fcli_end_of_main(rc); }