Added code

This commit is contained in:
Lian Drake 2024-06-15 21:11:26 -04:00
parent 83073a5988
commit 53fe2521e3
3 changed files with 346 additions and 1 deletions

19
Makefile Normal file
View file

@ -0,0 +1,19 @@
all: snconverter
WARNINGS = -Wall
DEBUG = -ggdb -fno-omit-frame-pointer
OPTIMIZE = -O2
OPTS = -lm
snconverter: Makefile snconverter.c
$(CC) -o $@ $(WARNINGS) $(DEBUG) $(OPTIMIZE) $(OPTS) snconverter.c
clean:
rm -f snconverter
install:
echo "Installing is not supported"
run:
./snconverter

128
README.md
View file

@ -1,2 +1,128 @@
# snconverter # snconverter
A simple and efficient command line numeric system conversion tool. Supports binary, decimal, hexadecimal and octal.
## Table of Contents
- [Introduction](#introduction)
- [Building](#building)
- [Usage](#usage)
- [Options](#options)
- [Examples](#examples)
- [Notes](#examples)
## Introduction
**snconverter** is a command-line utility designed to convert numbers between
different systems: decimal, binary, hexadecimal, and octal. It supports
conversion from any of these number systems to any other, providing a versatile
tool for developers, students, and anyone needing to perform such conversions
regularly.
## Building
This tool is provided as source code and can be built using `make`. By just
typing make in the terminal within the code's directory:
```bash
make
```
You should now have an executable named `snconverter`. You can copy it to a
location in your PATH for easy access.
## Usage
To use the `snconverter`, run the executable from the command line with the
appropriate options.
```bash
./snconverter [OPTIONS] <value>
```
## Options
**snconverter** accepts the following options:
- `-d`, `--decimal <value>`:
- Specify the input value is in decimal.
- `-b`, `--binary <value>`:
- Specify the input value is in binary.
- `-x`, `--hex <value>`:
- Specify the input value is in hexadecimal.
- `-o`, `--octal <value>`:
- Specify the input value is in octal.
- `-h`, `--help`:
- Display the help message and exit.
- `-v`, `--version`:
- Display the program version and exit.
## Examples
1. Convert a decimal number to binary, hexadecimal, and octal:
```bash
./snconverter -d 255
```
Output:
```
Binary: 11111111
Hexadecimal: FF
Octal: 377
```
2. Convert a binary number to decimal, hexadecimal, and octal:
```bash
./snconverter -b 11010101
```
Output:
```
Decimal: 213
Hexadecimal: D5
Octal: 325
```
3. Convert a hexadecimal number to decimal, binary, and octal:
```bash
./snconverter -x 1A3F
```
Output:
```
Decimal: 6719
Binary: 1101000111111
Octal: 15177
```
4. Display help message:
```bash
./snconverter -h
```
This will display detailed usage instructions and available options.
5. Display version:
```bash
./snconverter -v
```
This will show the current version of the program.
## Notes
- Input values must be valid numbers in their respective systems (e.g., no
letters in binary).
- This tool does not currently support floating-point numbers or numbers beyond
the range of standard 32-bit integers.

200
snconverter.c Normal file
View file

@ -0,0 +1,200 @@
/*
* snconverter.c
*
* Copyright 2024 Clay Gomera
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-only
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#define NAME "snconverter"
#define VERSION 0.1
void decimalToBinary(int num, char* result);
void decimalToHexadecimal(int num, char* result);
void decimalToOctal(int num, char* result);
void binaryToDecimal(const char* num, int* result);
void binaryToHexadecimal(const char* num, char* result);
void binaryToOctal(const char* num, char* result);
void hexadecimalToDecimal(const char* num, int* result);
void hexadecimalToBinary(const char* num, char* result);
void hexadecimalToOctal(const char* num, char* result);
void octalToDecimal(const char* num, int* result);
void octalToBinary(const char* num, char* result);
void octalToHexadecimal(const char* num, char* result);
void reverseString(char* str);
void displayHelp();
void displayVersion();
int main(int argc, char** argv) {
int option;
char result[100];
int decimal_result;
if (argc == 1) {
fprintf(stderr, "No argument provided.\n");
displayHelp();
return EXIT_FAILURE;
}
static const char* short_options = "d:b:x:o:abchv";
static struct option long_options[] = {
{"decimal", required_argument, NULL, 'd'},
{"binary", required_argument, NULL, 'b'},
{"hex", required_argument, NULL, 'x'},
{"octal", required_argument, NULL, 'o'},
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{NULL, 0, NULL, 0}
};
while ((option = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
switch (option) {
case 'd':
decimalToBinary(atoi(optarg), result);
printf("Binary: %s\n", result);
decimalToHexadecimal(atoi(optarg), result);
printf("Hexadecimal: %s\n", result);
decimalToOctal(atoi(optarg), result);
printf("Octal: %s\n", result);
break;
case 'b':
binaryToDecimal(optarg, &decimal_result);
printf("Decimal: %d\n", decimal_result);
binaryToHexadecimal(optarg, result);
printf("Hexadecimal: %s\n", result);
binaryToOctal(optarg, result);
printf("Octal: %s\n", result);
break;
case 'x':
hexadecimalToDecimal(optarg, &decimal_result);
printf("Decimal: %d\n", decimal_result);
hexadecimalToBinary(optarg, result);
printf("Binary: %s\n", result);
hexadecimalToOctal(optarg, result);
printf("Octal: %s\n", result);
break;
case 'o':
octalToDecimal(optarg, &decimal_result);
printf("Decimal: %d\n", decimal_result);
octalToBinary(optarg, result);
printf("Binary: %s\n", result);
octalToHexadecimal(optarg, result);
printf("Hexadecimal: %s\n", result);
break;
case 'h':
displayHelp();
return EXIT_SUCCESS;
case 'v':
displayVersion();
return EXIT_SUCCESS;
case '?':
default:
fprintf(stderr, "Use '-h, --help' for help.\n");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}
void decimalToBinary(int num, char* result) {
int index = 0;
while (num > 0) {
result[index++] = (num % 2) + '0';
num /= 2;
}
result[index] = '\0';
reverseString(result); // Reverse the string to get the correct order
}
void decimalToHexadecimal(int num, char* result) {
sprintf(result, "%X", num);
}
void decimalToOctal(int num, char* result) {
sprintf(result, "%o", num);
}
void binaryToDecimal(const char* num, int* result) {
*result = strtol(num, NULL, 2);
}
void binaryToHexadecimal(const char* num, char* result) {
int decimal = strtol(num, NULL, 2);
sprintf(result, "%X", decimal);
}
void binaryToOctal(const char* num, char* result) {
int decimal = strtol(num, NULL, 2);
sprintf(result, "%o", decimal);
}
void hexadecimalToDecimal(const char* num, int* result) {
*result = strtol(num, NULL, 16);
}
void hexadecimalToBinary(const char* num, char* result) {
int decimal = strtol(num, NULL, 16);
decimalToBinary(decimal, result);
}
void hexadecimalToOctal(const char* num, char* result) {
int decimal = strtol(num, NULL, 16);
decimalToOctal(decimal, result);
}
void octalToDecimal(const char* num, int* result) {
*result = strtol(num, NULL, 8);
}
void octalToBinary(const char* num, char* result) {
int decimal = strtol(num, NULL, 8);
decimalToBinary(decimal, result);
}
void octalToHexadecimal(const char* num, char* result) {
int decimal = strtol(num, NULL, 8);
decimalToHexadecimal(decimal, result);
}
void reverseString(char* str) {
int n = strlen(str);
for (int i = 0; i < n / 2; i++) {
char temp = str[i];
str[i] = str[n - i - 1];
str[n - i - 1] = temp;
}
}
void displayHelp() {
printf("Usage: %s -[d|b|h|o] <value> --[tob|tod|toh|too]\n", NAME);
printf("Options:\n");
printf("\t-d, --decimal\t<value>\tInput is in decimal\n");
printf("\t-b, --binary\t<value>\tInput is in binary\n");
printf("\t-h, --hex\t<value>\tInput is in hexadecimal\n");
printf("\t-o, --octal\t<value>\tInput is in octal\n");
printf("\t-h, --help\t\tDisplay this help message and exit.\n");
printf("\t-v, --version\t\tDisplay version and exit.\n");
}
void displayVersion() {
printf("%s version %.1f\n", NAME, VERSION);
}