1. Introduction

    System Information

  2. Inter-Process Communication
  3. Signals

    Programming in Various Environments

  4. Script Programming
    1. Script Variables
    2. Test Conditions
    3. Control and Iteration
    4. Commonly used Programs
    5. Shell Capabilities
    6. Example looping script
    7. Example using Variables
    8. Example working with files
    9. Example install script
  5. C and C++ Programming
    1. POSIX System Capabilities
    2. More POSIX
    3. Threads
    4. Mutexes
    5. An example viewmod program
    6. An example serial program
  6. X Programming
  7. Debugging
  8. Credits

Viewmod

#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/stat.h>

#define _POSIX_SOURCE 1         //POSIX compliant source
#define FALSE 0
#define TRUE 1
#define MAX_DEVICES 64
#define MAX_IDS 64
#define LINE_LENGTH 1128


FILE *output;

char input_fname[80];					//printer file name
FILE *input_file;
mode_t mode;
char Char;					//character for individual character processing
int display;	//"-D" options: 0-ASC,1-ASC/HEX, 2-Hex 3-dec 4-dec/asc 5-DOS text 6-UNIX text 7- strip all non-asc
int out_length;  //-L options
int display_col;	//display column counter
int char_len;
int asc_char;	//0-non-asc, 1-asc, 2-CR, 3-LF
int nospace;
int last_char;	//type of last char

int get_linestring(char *file_line, char *label_name, int qty_statements, int strno);
int freadln(FILE *handle,char *outputline);  //read a line from a file
void Process_Bufchar();	//process characters (Char) read into the serial buffer one at a time

main(int Parm_Count, char *Parms[])
{
   char message[90];
	int start_options, in_source, done;

   char *lastslash;				//string address where last slash is
   char dirname[80];			//directory name used to confirm directory existence
   DIR *current_directory;
   int i;
   char In1, Key;
   char buf[255];                       //buffer for where data is put

	out_length = 80;
	display = 1;  //default to HEX/ASC display, break after CR, CR/LF, LF
	start_options=0;
	in_source = 0;	//default, standard input
   if (Parm_Count>1)  //if have parameters after the program name
	{
		start_options = 1;
		strcpy(message,Parms[1]);
		if (message[0]!='-')  //if is an input file name
		{
			if ((input_file = fopen(Parms[1], "rb")) == NULL)
			{
				fprintf(stderr,"%s: Unable to open the input file %s\n",Parms[0],Parms[1]);
				exit(1);		//exit the program with an error
			}
			else
			{
				in_source = 1;  //file
			}
		}  //end if is an input file name
	}  //end if have parameters on the command line
	//get the parameters
	if (start_options<Parm_Count)  //if start options may exist
	{
		for (i=1; i<Parm_Count; i++)
		{
			strcpy(message, Parms[i]);
			if (message[0]=='-')
			{
				if ((message[1]=='D') || (message[1]=='d'))  //if display option
				{
					if (message[2]=='0') display=0;
					if (message[2]=='1') display=1;
					if (message[2]=='2') display=2;
					if (message[2]=='3') display=3;
					if (message[2]=='4') display=4;
					if (message[2]=='5') display=5;
					if (message[2]=='6') display=6;
					if (message[2]=='7') display=7;
				}
				if ((message[1]=='L') || (message[1]=='l'))  //if length option
				{
					out_length=atoi(&message[2]);
				}
			}
		}
	}  //end if start options may exist
	done = 0;
	display_col=0;
	nospace = 1;  //we don't need space
	last_char=4;
	while (!done)
	{
		if (in_source==1) //read a char from a file
		{
			if ((Char=fgetc(input_file))==EOF)
			{
				done = 1;
			}
		}
		else	//read a char from standard input
		{
			Char=getchar();
			if (Char==EOF)
			{
				done = 1;
			}
		}
		if (done==0)	//output the character to std output
		{
			asc_char=0;	//assume not asc char
			if ((Char>31) && (Char < 127)) asc_char = 1;
			if (Char==13) asc_char = 2;
			if (Char==10) asc_char = 3;
		   switch (display)
			{
			case 0:		//ASC
				if (asc_char < 2) char_len=1;
				else char_len=0;
				if (display_col+char_len>out_length)
				{
					putchar(10);  //scroll the line if will be too long
					display_col=0;
				}
				putchar(Char);
				display_col++;
				if (asc_char==3) display_col=0;
				break;
			case 1:		//ASC/HEX
			default:
				if (asc_char==1) char_len=1;
				else char_len=2;
				if ((display_col==0) || (last_char==4) || ((last_char==1) && (asc_char==1)))  nospace=1;  //dont need space
				else nospace=0;
				if (nospace==0) char_len++;  //if we need a space
				if (display_col+char_len>out_length)
				{
					putchar(10);  //scroll the line if will be too long
					display_col=0;
					if (nospace==0)
					{
						nospace=1;
						char_len--;
					}
				}
				if (nospace==0)  //add a space
				{
					putchar(' ');
					display_col++;
				}
				if (asc_char==1)
				{
					putchar(Char);
					display_col++;
				}
				else
				{
					sprintf(message,"%2x",Char);
					fputs(message,stdout);
					display_col +=2;
					if (asc_char==3)
					{
						putchar(10);
						display_col=0;
					}
				}
				if ((last_char==2) && (asc_char!=3))  //if had a CR with no LF
				{
					putchar(10);
					display_col=0;
				}

				last_char=asc_char;
				break;
			case 2:		//hex
				char_len=2;
				if (display_col==0) nospace = 1;
				else nospace = 0;
				if (nospace == 0) char_len++;		//if we need a space
				if (display_col+char_len>out_length)
				{
					putchar(10);  //scroll the line if will be too long
					display_col=0;
					if (nospace==0)
					{
						nospace=1;
						char_len--;
					}
				}
				if (nospace==0)  //add a space
				{
					putchar(' ');
					display_col++;
				}
				sprintf(message,"%2x",Char);
				fputs(message,stdout);
				display_col +=2;
				break;
			case 5:		//unix text - adjusts to dos text, adds CR before all LF
				if (Char==10) putchar(13);
				putchar(Char);
				break;
			case 6:		//dos text - strips to unix, strips all CR
				if ((last_char==2) && (asc_char !=3))  putchar(10); //if this char is not a LF and the last one was CR, need a line feed for unix
				if (Char!=13) putchar(Char);
				last_char=asc_char;
				break;
			case 3:		//decimal
				char_len=3;
				if (display_col==0) nospace = 1;
				else nospace = 0;
				if (nospace == 0) char_len++;		//if we need a space
				if (display_col+char_len>out_length)
				{
					putchar(10);  //scroll the line if will be too long
					display_col=0;
					if (nospace==0)
					{
						nospace=1;
						char_len--;
					}
				}
				if (nospace==0)  //add a space
				{
					putchar(' ');
					display_col++;
				}
				sprintf(message,"%3d",Char);
				fputs(message,stdout);
				display_col +=2;
				break;
			case 4:		//decimal asc
				if (asc_char==1) char_len=1;
				else char_len=3;
				if ((display_col==0) || (last_char==4) || ((last_char==1) && (asc_char==1)))  nospace=1;  //dont need space
				else nospace=0;
				if (nospace==0) char_len++;  //if we need a space
				if (display_col+char_len>out_length)
				{
					putchar(10);  //scroll the line if will be too long
					display_col=0;
					if (nospace==0)
					{
						nospace=1;
						char_len--;
					}
				}
				if (nospace==0)  //add a space
				{
					putchar(' ');
					display_col++;
				}
				if (asc_char==1)
				{
					putchar(Char);
					display_col++;
				}
				else
				{
					sprintf(message,"%3d",Char);
					fputs(message,stdout);
					display_col +=2;
					if (asc_char==3)
					{
						putchar(10);
						display_col=0;
					}
				}
				if ((last_char==2) && (asc_char!=3))  //if had a CR with no LF
				{
					putchar(10);
					display_col=0;
				}
				last_char=asc_char;
				break;
			case 7:			//strips all non-asc chars to Unix file (all but ASC and LF)
				if ((asc_char==1) || (asc_char==3)) putchar(Char);
				break;
			}  //end of switch display
		}  //end of if not done
	}  //end of while not done
}  //end of main