/* -*- 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 */ /** This is a template application for libfossil fcli client apps, with commentary explaining how to do various common things with the API. Copy/paste this and modify it to suit. */ #include "fossil-scm/fossil-cli.h" #include "fossil-scm/fossil-internal.h" // Only for testing/debugging.. #define MARKER(pfexp) \ do{ printf("MARKER: %s:%d:%s():\t",__FILE__,__LINE__,__func__); \ printf pfexp; \ } while(0) // Global app state. struct App_ { char const * lineLHS; char const * lineRHS; } App = { NULL,//lineLHS NULL//lineRHS }; static int app_stuff(void){ fsl_dline a = fsl_dline_empty; fsl_dline b = fsl_dline_empty; fsl_dline_change chng = fsl_dline_change_empty; int i, j, x; a.z = App.lineLHS; a.n = (int)fsl_strlen(a.z); b.z = App.lineRHS; b.n = (int)fsl_strlen(b.z); fsl_dline_change_spans(&a, &b, &chng); f_out("left: [%s]\n", a.z); for(i=x=0; i<chng.n; i++){ int ofst = chng.a[i].iStart1; int len = chng.a[i].iLen1; if( len ){ if( x==0 ){ f_out("%*s", 8, ""); } while( ofst > x ){ if( (a.z[x]&0xc0)!=0x80 ) f_out(" "); x++; } for(j=0; j<len; j++, x++){ if( (a.z[x]&0xc0)!=0x80 ) f_out("%d",i); } } } if( x ) f_out("\n"); f_out("right: [%s]\n", b.z); for(i=x=0; i<chng.n; i++){ int ofst = chng.a[i].iStart2; int len = chng.a[i].iLen2; if( len ){ if( x==0 ){ f_out("%*s", 8, ""); } while( ofst > x ){ if( (b.z[x]&0xc0)!=0x80 ) f_out(" "); x++; } for(j=0; j<len; j++, x++){ if( (b.z[x]&0xc0)!=0x80 ) f_out("%d",i); } } } if( x ) f_out("\n"); return 0; } int main(int argc, const char * const * argv ){ const fcli_cliflag FCliFlags[] = { fcli_cliflag_empty_m // list MUST end with this (or equivalent) }; const fcli_help_info FCliHelp = { "Tests diff calculation between two lines " "using the 2021-era diff APIs.", "lineLHS lineRHS", NULL }; fcli.cliFlags = FCliFlags; fcli.appHelp = &FCliHelp; fcli.clientFlags.checkoutDir = NULL; // same effect as global -C flag. int rc = fcli_setup(argc, argv); if(rc) goto end; App.lineLHS = fcli_next_arg(true); App.lineRHS = fcli_next_arg(true); if(!App.lineRHS){ rc =fcli_err_set(FSL_RC_MISUSE, "Expecting two one-line strings to diff."); goto end; } if((rc=fcli_has_unused_args(false))) goto end; rc = app_stuff(); end: return fcli_end_of_main(rc); }