tabstops.c
author viric@llimona
Thu, 18 May 2006 22:56:54 +0200
changeset 0 cb8aa6a22086
permissions -rw-r--r--
Init from svn.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     2
#include <stdlib.h>
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     3
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     4
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     5
#define MAXTABSTOPS 50
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     6
#define MAXLINECHARS 10000
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     7
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     8
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
     9
void strpart(char * dest, const char *src, const int begin, const int end)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    10
{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    11
	int i;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    12
	i=begin;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    13
	while (i<=end)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    14
	{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    15
		dest[i-begin] = src[i];
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    16
		i++;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    17
	}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    18
	
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    19
	dest[i-begin] = '\0';
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    20
}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    21
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    22
int main(int numarg, char **args)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    23
{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    24
	int tabstops[MAXTABSTOPS+1];
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    25
	int i,j;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    26
	char original[MAXLINECHARS];
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    27
	char word[MAXLINECHARS];
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    28
	int this_tab_stop;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    29
	int last_char;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    30
	int reverse=0;	/* Funcionament normal */
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    31
	int num_tab_stops;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    32
	int output_column;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    33
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    34
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    35
	if (numarg<2)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    36
	{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    37
		printf("Bad Usage.\n");
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    38
		exit(1);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    39
	}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    40
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    41
	tabstops[0] = 0;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    42
	tabstops[numarg] = MAXLINECHARS;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    43
	num_tab_stops = 1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    44
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    45
	for (i=1; i<numarg; i++)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    46
	{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    47
		if (args[i][0] == '-')
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    48
			switch(args[i][1])
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    49
			{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    50
			case 'r':
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    51
				reverse=1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    52
			}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    53
		else
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    54
			tabstops[num_tab_stops++] = atoi(args[i])-1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    55
		/* Usually columns start at '1' */
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    56
		/* Not error-free in atoi! */
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    57
	}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    58
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    59
	while(!feof(stdin))
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    60
	{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    61
		fgets(original, MAXLINECHARS, stdin);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    62
		if (feof(stdin)) break;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    63
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    64
		if (reverse==0)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    65
			this_tab_stop=0;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    66
		else
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    67
			this_tab_stop=1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    68
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    69
		last_char=-1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    70
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    71
		if(reverse==0)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    72
		{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    73
			for(i=0; i<strlen(original); i++)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    74
			{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    75
				if(i == tabstops[this_tab_stop+1])
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    76
				{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    77
					strpart(word, original, tabstops[this_tab_stop], last_char);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    78
					printf("%s", word);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    79
					if(this_tab_stop != num_tab_stops)	/* Ultim tab stop */
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    80
						putchar('\t');
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    81
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    82
					/* A pel proxim tab */
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    83
					last_char = tabstops[++this_tab_stop]-1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    84
				}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    85
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    86
				if(original[i] != ' ')
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    87
					last_char = i;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    88
			}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    89
			/* Final de linia */
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    90
			strpart(word, original, tabstops[this_tab_stop], last_char);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    91
			printf("%s", word);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    92
		}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    93
		else
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    94
		{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    95
			this_tab_stop=1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    96
			output_column=1;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    97
			for(i=0; i<strlen(original); i++)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    98
			{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
    99
				if(original[i]=='\t' && this_tab_stop < num_tab_stops) 
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   100
				{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   101
					for(j=output_column; j<=tabstops[this_tab_stop]; j++)
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   102
					{
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   103
						putchar(' ');
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   104
					}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   105
					output_column = tabstops[this_tab_stop];
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   106
					this_tab_stop++;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   107
				}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   108
				else
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   109
					putchar(original[i]);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   110
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   111
				output_column++;
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   112
			}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   113
		}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   114
			
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   115
	}
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   116
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   117
	exit(0);
cb8aa6a22086 Init from svn.
viric@llimona
parents:
diff changeset
   118
}