/********************/
#include <stdio.h>
#include <stdlib.h>
//#include <ctype.h>
#include "readline.h"
#define NAME_LEN 25
struct part {
int number;
char name[NAME_LEN+1];
int on_hand;
struct part *next;
};
struct part *inventory = NULL; /* points to first part */
struct part *find_part(int number);
void insert(void);
void search(void);
void update(void);
void print(void);
/* main prompts the user to enter an operations code then calls a function to perform the
requested action until user enters command 'q'*/
int main(void)
{
char code;
for (;;){
printf("Enter operation code : ");
scanf(" %c", &code);
while (getchar() !='\n') /*skips to end of line */
;
switch (code) {
case 'i' : insert();
break;
case 's' : search();
break;
case 'u' : update();
break;
case 'p' : print();
break;
case 'q' : return 0;
default: printf("Illegal code \n");
}
printf("\n");
}
}
/* find_part : looks up a part number in the inventory list and rerturns a pointer
to the node containing the part number, if the part number is not found it returns
NULL */
struct part *find_part(int number)
{
struct part *p;
for (p=inventory; p!=NULL && number > p->number; p=p->next)
;
if (p!=NULL && number == p->number)
return p;
return NULL;
}
/* insert : Prompts the users for information about a new part and then
inserts the part info into the inventory list; the list remains sorted
by part number. prints an error message and return prematurely if the part
already exits or space could not be allocated for the part */
void insert(void)
{
struct part *cur, *prev, *new_node;
new_node = malloc(sizeof(struct part));
if (new_node == NULL){
printf("Database is full; cannot add more parts. \n");
return;
}
printf("Enter part number : ");
scanf("%d", &new_node->number);
for (cur = inventory, prev = NULL;
cur != NULL && new_node->number > cur->number;
prev = cur, cur = cur->next)
;
if(cur !=NULL && new_node->number == cur->number){
printf(" Part already exists. \n");
free(new_node);
return;
}
printf("Enter part name: ");
read_line(new_node->name, NAME_LEN);
printf("Enter quantity on hand: ");
scanf("%d", &new_node->on_hand);
new_node->next=cur;
if(prev==NULL)
inventory=new_node;
else
prev->next=new_node;
}
/* search : prompts user to enter a part number and looks up the
part in the database. If the part exits, prints the name and quantity
on hand, if not prints an error message */
void search(void)
{
int number;
struct part *p;
printf( " Enter part number to search : ");
scanf("%d", &number);
p=find_part(number);
if(p!=NULL){
printf("Part name: %s\n", p->name);
printf("Quantity on hand : %d\n", p->on_hand);
}
else
printf("Part not found. \n");
}
/* update : prompts the user to enter a part number. prints an error
message if the part does not exist, otherwise prompts the user
to enter change in quantity on hand and updates the database*/
void update(void)
{
int number, change;
struct part *p;
printf("Enter part number: ");
scanf("%d", &number);
p = find_part(number);
if(p != NULL){
printf("Enter change in quantity on hand: ");
scanf("%d", &change);
p->on_hand += change;
}
else
printf( " Part not found. \n");
}
/* print : prints a listing of all parts in the database
showing the part number, part name, and quantity on hand.
part numbers will appear in ascending order. */
void print(void)
{
struct part *p;
printf("Part Number Part Name Quantity on Hand\n");
for (p = inventory; p !=NULL; p = p->next)
printf("%7d %-25s%11d\n", p->number, p->on_hand);
}
#ifndef READLINE_H
#define READLINE_H
/* read_line: skips leading white space chars then reads the
remainder of the input line and stores it in str. Truncates the line if
its length exceeds n. Returns a number of char stored. */
int read_line (char str[], int n);
#endif
#include <ctype.h>
#include <stdio.h>
#include "readline.h"
int read_line(char str[], int n)
{
int ch, i=0;
while (isspace(ch=getchar()))
;
while (ch != '\n' && ch !=EOF){
if(i<n)
str[i++]=ch;
ch=getchar();
}
str[i] = '\0';
return i;
}