#include <stdio.h>
#include "readline.h"
#define NAME_LEN 25
#define MAX_PARTS 100
struct part {
int number;
char name[NAME_LEN+1];
int on_hand;
};
int find_part(int number, const struct part inv[], int np);
void insert(struct part inv[], int *np);
void search(const struct part inv[], int np);
void update(struct part inv[], int np);
void print(const struct part inv[], int np);
/**********************************************************
* main: Prompts the user to enter an operation code, *
* then calls a function to perform the requested *
* action. Repeats until the user enters the *
* command 'q'. Prints an error message if the user *
* enters an illegal code. *
**********************************************************/
int main(void)
{
char code;
struct part inventory[MAX_PARTS];
int num_parts = 0;
for (;;) {
printf("Enter operation code: "); while (getchar() != '\n') /* skips to end of line */ ;
switch (code) {
case 'i': insert(inventory, &num_parts);
break;
case 's': search(inventory, num_parts);
break;
case 'u': update(inventory, num_parts);
break;
case 'p': print(inventory, num_parts);
break;
case 'q': return 0;
default: printf("Illegal code\n"); }
}
}
/**********************************************************
* find_part: Looks up a part number in the inv array. *
* Returns the array index if the part number *
* is found; otherwise, returns -1. *
**********************************************************/
int find_part(int number, const struct part inv[], int np)
{
int i;
for (i = 0; i < np; i++)
if (inv[i].number == number)
return i;
return -1;
}
/**********************************************************
* insert: Prompts the user for information about a new *
* part and then inserts the part into the inv *
* array. Prints an error message and returns *
* prematurely if the part already exists or the *
* array is full. *
**********************************************************/
void insert(struct part inv[], int *np)
{
int part_number;
if (*np == MAX_PARTS) {
printf("Database is full; can't add more parts.\n"); return;
}
printf("Enter part number: "); scanf("%d", &part_number
); if (find_part(part_number, inv, *np) >= 0) {
printf("Part already exists.\n"); return;
}
inv[*np].number = part_number;
read_line(inv[*np].name, NAME_LEN);
printf("Enter quantity on hand: "); scanf("%d", &inv
[*np
].
on_hand); (*np)++;
}
/**********************************************************
* search: Prompts the user to enter a part number, then *
* looks up the part in the inv array. If the *
* part exists, prints the name and quantity on *
* hand; if not, prints an error message. *
**********************************************************/
void search(const struct part inv[], int np)
{
int i, number;
printf("Enter part number: "); i = find_part(number, inv, np);
if (i >= 0) {
printf("Part name: %s\n", inv
[i
].
name); printf("Quantity on hand: %d\n", inv
[i
].
on_hand); } else
}
/**********************************************************
* update: Prompts the user to enter a part number. *
* Prints an error message if the part can't be *
* found in the inv array; otherwise, prompts the *
* user to enter change in quantity on hand and *
* updates the array. *
**********************************************************/
void update(struct part inv[], int np)
{
int i, number, change;
printf("Enter part number: "); i = find_part(number, inv, np);
if (i >= 0) {
printf("Enter change in quantity on hand: "); inv[i].on_hand += change;
} else
}
/**********************************************************
* print: Prints a listing of all parts in the inv array, *
* showing the part number, part name, and *
* quantity on hand. Parts are printed in the *
* order in which they were entered into the *
* array. *
**********************************************************/
void print(const struct part inv[], int np)
{
int i;
printf("Part Number Part Name " "Quantity on Hand\n");
for (i = 0; i < np; i++)
printf("%7d %-25s%11d\n", inv
[i
].
number, inv[i].name, inv[i].on_hand);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJyZWFkbGluZS5oIgoKI2RlZmluZSBOQU1FX0xFTiAyNQojZGVmaW5lIE1BWF9QQVJUUyAxMDAKCnN0cnVjdCBwYXJ0IHsKICBpbnQgbnVtYmVyOwogIGNoYXIgbmFtZVtOQU1FX0xFTisxXTsKICBpbnQgb25faGFuZDsKfTsKCmludCBmaW5kX3BhcnQoaW50IG51bWJlciwgY29uc3Qgc3RydWN0IHBhcnQgaW52W10sIGludCBucCk7CnZvaWQgaW5zZXJ0KHN0cnVjdCBwYXJ0IGludltdLCBpbnQgKm5wKTsKdm9pZCBzZWFyY2goY29uc3Qgc3RydWN0IHBhcnQgaW52W10sIGludCBucCk7CnZvaWQgdXBkYXRlKHN0cnVjdCBwYXJ0IGludltdLCBpbnQgbnApOwp2b2lkIHByaW50KGNvbnN0IHN0cnVjdCBwYXJ0IGludltdLCBpbnQgbnApOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbWFpbjogUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhbiBvcGVyYXRpb24gY29kZSwgICAgICoKICogICAgICAgdGhlbiBjYWxscyBhIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCAgICoKICogICAgICAgYWN0aW9uLiBSZXBlYXRzIHVudGlsIHRoZSB1c2VyIGVudGVycyB0aGUgICAgICAgICoKICogICAgICAgY29tbWFuZCAncScuIFByaW50cyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSB1c2VyICoKICogICAgICAgZW50ZXJzIGFuIGlsbGVnYWwgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBtYWluKHZvaWQpCnsKICBjaGFyIGNvZGU7CiAgc3RydWN0IHBhcnQgaW52ZW50b3J5W01BWF9QQVJUU107CiAgaW50IG51bV9wYXJ0cyA9IDA7CgogIGZvciAoOzspIHsKICAgIHByaW50ZigiRW50ZXIgb3BlcmF0aW9uIGNvZGU6ICIpOwogICAgc2NhbmYoIiAlYyIsICZjb2RlKTsKICAgIHdoaWxlIChnZXRjaGFyKCkgIT0gJ1xuJykgICAvKiBza2lwcyB0byBlbmQgb2YgbGluZSAqLwogICAgICA7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgY2FzZSAnaSc6IGluc2VydChpbnZlbnRvcnksICZudW1fcGFydHMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3MnOiBzZWFyY2goaW52ZW50b3J5LCBudW1fcGFydHMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3UnOiB1cGRhdGUoaW52ZW50b3J5LCBudW1fcGFydHMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3AnOiBwcmludChpbnZlbnRvcnksIG51bV9wYXJ0cyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgY2FzZSAncSc6IHJldHVybiAwOwogICAgICBkZWZhdWx0OiAgcHJpbnRmKCJJbGxlZ2FsIGNvZGVcbiIpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZmluZF9wYXJ0OiBMb29rcyB1cCBhIHBhcnQgbnVtYmVyIGluIHRoZSBpbnYgYXJyYXkuICAgICoKICogICAgICAgICAgICBSZXR1cm5zIHRoZSBhcnJheSBpbmRleCBpZiB0aGUgcGFydCBudW1iZXIgICoKICogICAgICAgICAgICBpcyBmb3VuZDsgb3RoZXJ3aXNlLCByZXR1cm5zIC0xLiAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBmaW5kX3BhcnQoaW50IG51bWJlciwgY29uc3Qgc3RydWN0IHBhcnQgaW52W10sIGludCBucCkKewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgbnA7IGkrKykKICAgIGlmIChpbnZbaV0ubnVtYmVyID09IG51bWJlcikKICAgICAgcmV0dXJuIGk7CiAgcmV0dXJuIC0xOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpbnNlcnQ6IFByb21wdHMgdGhlIHVzZXIgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgbmV3ICAgKgogKiAgICAgICAgIHBhcnQgYW5kIHRoZW4gaW5zZXJ0cyB0aGUgcGFydCBpbnRvIHRoZSBpbnYgICAgKgogKiAgICAgICAgIGFycmF5LiBQcmludHMgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyAgICAgKgogKiAgICAgICAgIHByZW1hdHVyZWx5IGlmIHRoZSBwYXJ0IGFscmVhZHkgZXhpc3RzIG9yIHRoZSAgKgogKiAgICAgICAgIGFycmF5IGlzIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBpbnNlcnQoc3RydWN0IHBhcnQgaW52W10sIGludCAqbnApCnsKICBpbnQgcGFydF9udW1iZXI7CgogIGlmICgqbnAgPT0gTUFYX1BBUlRTKSB7CiAgICBwcmludGYoIkRhdGFiYXNlIGlzIGZ1bGw7IGNhbid0IGFkZCBtb3JlIHBhcnRzLlxuIik7CiAgICByZXR1cm47CiAgfQoKICBwcmludGYoIkVudGVyIHBhcnQgbnVtYmVyOiAiKTsKICBzY2FuZigiJWQiLCAmcGFydF9udW1iZXIpOwogIGlmIChmaW5kX3BhcnQocGFydF9udW1iZXIsIGludiwgKm5wKSA+PSAwKSB7CiAgICBwcmludGYoIlBhcnQgYWxyZWFkeSBleGlzdHMuXG4iKTsKICAgIHJldHVybjsKICB9CgogIGludlsqbnBdLm51bWJlciA9IHBhcnRfbnVtYmVyOwogIHByaW50ZigiRW50ZXIgcGFydCBuYW1lOiAiKTsKICByZWFkX2xpbmUoaW52WypucF0ubmFtZSwgTkFNRV9MRU4pOwogIHByaW50ZigiRW50ZXIgcXVhbnRpdHkgb24gaGFuZDogIik7CiAgc2NhbmYoIiVkIiwgJmludlsqbnBdLm9uX2hhbmQpOwogICgqbnApKys7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHNlYXJjaDogUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIHBhcnQgbnVtYmVyLCB0aGVuICAqCiAqICAgICAgICAgbG9va3MgdXAgdGhlIHBhcnQgaW4gdGhlIGludiBhcnJheS4gSWYgdGhlICAgICAqCiAqICAgICAgICAgcGFydCBleGlzdHMsIHByaW50cyB0aGUgbmFtZSBhbmQgcXVhbnRpdHkgb24gICAqCiAqICAgICAgICAgaGFuZDsgaWYgbm90LCBwcmludHMgYW4gZXJyb3IgbWVzc2FnZS4gICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHNlYXJjaChjb25zdCBzdHJ1Y3QgcGFydCBpbnZbXSwgaW50IG5wKQp7CiAgaW50IGksIG51bWJlcjsKCiAgcHJpbnRmKCJFbnRlciBwYXJ0IG51bWJlcjogIik7CiAgc2NhbmYoIiVkIiwgJm51bWJlcik7CiAgaSA9IGZpbmRfcGFydChudW1iZXIsIGludiwgbnApOwogIGlmIChpID49IDApIHsKICAgIHByaW50ZigiUGFydCBuYW1lOiAlc1xuIiwgaW52W2ldLm5hbWUpOwogICAgcHJpbnRmKCJRdWFudGl0eSBvbiBoYW5kOiAlZFxuIiwgaW52W2ldLm9uX2hhbmQpOwogIH0gZWxzZQogICAgcHJpbnRmKCJQYXJ0IG5vdCBmb3VuZC5cbiIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiB1cGRhdGU6IFByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBwYXJ0IG51bWJlci4gICAgICAgKgogKiAgICAgICAgIFByaW50cyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBwYXJ0IGNhbid0IGJlICAgKgogKiAgICAgICAgIGZvdW5kIGluIHRoZSBpbnYgYXJyYXk7IG90aGVyd2lzZSwgcHJvbXB0cyB0aGUgKgogKiAgICAgICAgIHVzZXIgdG8gZW50ZXIgY2hhbmdlIGluIHF1YW50aXR5IG9uIGhhbmQgYW5kICAgKgogKiAgICAgICAgIHVwZGF0ZXMgdGhlIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB1cGRhdGUoc3RydWN0IHBhcnQgaW52W10sIGludCBucCkKewogIGludCBpLCBudW1iZXIsIGNoYW5nZTsKCiAgcHJpbnRmKCJFbnRlciBwYXJ0IG51bWJlcjogIik7CiAgc2NhbmYoIiVkIiwgJm51bWJlcik7CiAgaSA9IGZpbmRfcGFydChudW1iZXIsIGludiwgbnApOwogIGlmIChpID49IDApIHsKICAgIHByaW50ZigiRW50ZXIgY2hhbmdlIGluIHF1YW50aXR5IG9uIGhhbmQ6ICIpOwogICAgc2NhbmYoIiVkIiwgJmNoYW5nZSk7CiAgICBpbnZbaV0ub25faGFuZCArPSBjaGFuZ2U7CiAgfSBlbHNlCiAgICBwcmludGYoIlBhcnQgbm90IGZvdW5kLlxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHByaW50OiBQcmludHMgYSBsaXN0aW5nIG9mIGFsbCBwYXJ0cyBpbiB0aGUgaW52IGFycmF5LCAqCiAqICAgICAgICBzaG93aW5nIHRoZSBwYXJ0IG51bWJlciwgcGFydCBuYW1lLCBhbmQgICAgICAgICAqCiAqICAgICAgICBxdWFudGl0eSBvbiBoYW5kLiBQYXJ0cyBhcmUgcHJpbnRlZCBpbiB0aGUgICAgICAqCiAqICAgICAgICBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgZW50ZXJlZCBpbnRvIHRoZSAgICAgICAqCiAqICAgICAgICBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHByaW50KGNvbnN0IHN0cnVjdCBwYXJ0IGludltdLCBpbnQgbnApCnsKICBpbnQgaTsKCiAgcHJpbnRmKCJQYXJ0IE51bWJlciAgIFBhcnQgTmFtZSAgICAgICAgICAgICAgICAgICIKICAgICAgICAgIlF1YW50aXR5IG9uIEhhbmRcbiIpOwogIGZvciAoaSA9IDA7IGkgPCBucDsgaSsrKQogICAgcHJpbnRmKCIlN2QgICAgICAgJS0yNXMlMTFkXG4iLCBpbnZbaV0ubnVtYmVyLAogICAgICAgICAgIGludltpXS5uYW1lLCBpbnZbaV0ub25faGFuZCk7Cn0=