Deutsch   English   Français   Italiano  
<20250304175602.c9fe683d678d3a2ed101a4ac@g{oogle}mail.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Anton Shepelev <anton.txt@g{oogle}mail.com>
Newsgroups: comp.lang.c
Subject: Re: Which code style do you prefer the most?
Date: Tue, 4 Mar 2025 17:56:02 +0300
Organization: A noiseless patient Spider
Lines: 182
Message-ID: <20250304175602.c9fe683d678d3a2ed101a4ac@g{oogle}mail.com>
References: <vpkmq0$21php$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Injection-Date: Tue, 04 Mar 2025 15:56:04 +0100 (CET)
Injection-Info: dont-email.me; posting-host="35a27bf72a86c6fb6a2c86ddce86583c";
	logging-data="2005586"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+Jk4YTP/dvqXY21qdKeMwX/f42hFSpcLM="
Cancel-Lock: sha1:YwknxtYlL02mpJbOMF/AcYxVuh0=
X-Newsreader: Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32)
Bytes: 6288

Ar Rakin:

> I've been writing C code for a long time, in different styles, but 
> always wanted to know which code style most people prefer. This is all 
> about that question. Which one of the following do you prefer the most?

> 1. GNU Style
> 2. Linux Style

I don't like them much. Below is a piece of my code
(previosly shown in this group). It uses tabs for
indentation and spaces for alignment.

-- sort.c --
#include <stdio.h>
#include <limits.h>
#include "sort.h"

/* Partition an array [l..r] around a "pivot" member so that */
/* the elements of the left sub-array do not exceed, and the ones */
/* of the right sub-array are not less than, the pivot. */
static int /* returns the right boundary of the left sub-array */
partition
(	void * data, /* pointer to the full array              */
	int    l,    /* left  boundary of the sub-array        */
	int    r,    /* right boundary of the sub-array, l < r */
  	comp_f comp,
	swap_f swap,
	void * extra
)
{	int p; /* index of the pivot, element */
	p = ( l + r ) / 2; /* Chose the middle element as pivot */

	while( 1 )
	{	/* advance cursors until they stop at a pair of elements */
		/* that should be swapped or meet or go past each other.  */
		/* The pivot element serves as a sentinel.                */
		while( comp( data, l, p, extra ) < 0 ) l += 1;
		while( comp( data, r, p, extra ) > 0 ) r -= 1;
		if( l >= r ) break;

		swap( data, l, r );      /* Swap the pair found         */
		     if( l == p ) p = r; /* Update pivot location if it */
		else if( r == p ) p = l; /* was changed during the swap */

		/* Advance the cursors. If they are adjecent they will cross: */
		l += 1; r -= 1;
	}
	return r;
}

void sort
(	void * data,
	int    len,
	comp_f comp,
	swap_f swap,
	void * extra
)
{  /* In this algorithm, minimun sufficient stack size is Log(len) */
	int sl[sizeof(int) * CHAR_BIT]; /* left  sub-array boundaries on the stack */
	int sr[sizeof(int) * CHAR_BIT]; /* right sub-array boundaries nn the stack */

	int d;          /* stack depth */
	int l, r;       /* left and right boundaries of a sub-array */
	int lpos, rpos; /* positions of the left and right new sub-arrays on the stack */
	int newr;       /* the right boundary of the new left sub-array */

	d     = 1; /* Put the initial sub-array onto the stack */
	sl[0] = 0; sr[0] = len - 1;	
	while( d > 0 )
	{	d -= 1; /* Take an element from the stack */
		l = sl[d]; r = sr[d];
		if( l >= r ) continue; /* Skip a subarray shorter than two */
		
		newr = partition( data, l , r, comp, swap, extra );

		/* process the shorter sub-array first to ease the stack: */
		lpos = d; rpos = d; 
		if( newr - l > r - newr - 1 ) rpos += 1;
		else                          lpos += 1;

		/* Put partiioned sub-arrays onto the stack: */
		sl[lpos] = l;        sr[lpos] = newr;
		sl[rpos] = newr + 1; sr[rpos] = r;
		d += 2;
	}
}
-- sort.h --
/* ----------------------- A generic sorting routine ------------------------ */
/* Comparison function:
    > 0 <=> data[i] > data[j]
    < 0 <=> data[i] < data[j]
   == 0 <=> data[i] = data[j] */
typedef int  (*comp_f)( const void * data, int i, int j, void * extra );

/* Exchange ith and jth elements: */
typedef void (*swap_f)( void * data, int i, int j );

void sort
(	void * data, /* pointer to data to sort         */
	int    len,  /* length of data to sort          */
	comp_f comp, /* comparison function             */
	swap_f swap, /* swap function                   */
	void * extra /* user-supplied parameter to comp */
);
-- test.c --
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sort.h"

static void print( int * a, int n )
{	int i;
	for( i = 0; i < n; i++ )
		printf("%i ", a[i] );
	printf("\n");
}

static int intcomp( int a, int b )
{	if( a > b ) return  1;
	if( a < b ) return -1;
	            return  0;
}

static int comp( const void * data, int i, int j, void * extra )
{	return intcomp( ( (int*)data )[i], ( (int*)data )[j] );  }

/* comparison for qsort: */
static int qscomp(const void * a, const void * b)
{	return intcomp( *(int*)a, *(int*)b );  }

static void swap( void * data, int i, int j )
{	int buf;
	buf = ( (int*)data )[i];
	( (int*)data )[i] = ( (int*)data )[j];
	( (int*)data )[j] = buf;
}

#define TESTLEN 500
/* performance test with a random array: */
static void test()
{	int     a[TESTLEN], c[TESTLEN];
	int     i, j;
	clock_t start, total;

	total = 0;
	for( i = 0; i < 1000; i++ )
	{	for( j = 0; j < TESTLEN; j++ )
		{	a[j] = rand() % 5;
			c[j] = a[j];
		}
		start = clock();
		/*qsort( a, testlen, sizeof(int), &qscomp );*/
		sort( a, TESTLEN, &comp, &swap, NULL );
		total += clock() - start;	
		for( j = 0; j < TESTLEN-1; j++ )
		{	if( a[j] > a[j+1] )
			{	print( c, TESTLEN );
				print( a, TESTLEN );
				return;
			}
		}
	}
	printf("Time: %f\n", (float)total / CLOCKS_PER_SEC );
}

/* test with a small hard-coded array: */
#define TMLEN 3
static void testman( void )
{	int ta[TMLEN] = {3,2,1};
	print( ta, TMLEN );
	sort ( ta, TMLEN, &comp, &swap, NULL );
	print( ta, TMLEN );
}

int main( int argc, char** argv )
{	/*testman();
	return 0;*/

	test();
	return 0;
========== REMAINDER OF ARTICLE TRUNCATED ==========