asciidencoder/asciidencoder.c
2024-06-15 21:16:39 -04:00

132 lines
3.8 KiB
C

/*
* asciidencoder.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 <stdlib.h>
#include <string.h>
#include <locale.h>
#include <getopt.h>
#define VERSION 0.1
#define NAME "asciidencoder"
void stringToAscii(char* input);
void asciiToCharacter(char *input);
void displayHelp();
void displayVersion();
int main(int argc, char **argv) {
setlocale(LC_ALL, "");
int option;
int s_flag = 0, c_flag = 0;
char *s_value = NULL, *c_value = NULL;
static const char* short_options = "s:c:hv";
static struct option long_options[] = {
{"string", required_argument, NULL, 's'},
{"code", required_argument, NULL, 'c'},
{"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 's':
s_flag = 1;
s_value = optarg;
break;
case 'c':
c_flag = 1;
c_value = optarg;
break;
case 'h':
displayHelp();
return 0;
case 'v':
displayVersion();
return 0;
case '?':
default:
fprintf(stderr, "Use '-h, --help' for help.\n");
return EXIT_FAILURE;
}
}
if (s_flag && c_flag) {
fprintf(stderr, "Use only one option at a time.\n");
displayHelp();
return EXIT_FAILURE;
}
// Check if no valid option was provided and display the help message
if (!s_flag && !c_flag) {
fprintf(stderr, "No valid options provided.\n");
displayHelp();
return EXIT_FAILURE;
}
// Check which arguments are present
if (s_flag) {
stringToAscii(s_value);
}
else if (c_flag) {
asciiToCharacter(c_value);
}
return EXIT_SUCCESS;
}
void stringToAscii(char *input) {
input[strlen(input)] = '\0';
for (int i = 0; i < strlen(input); i++) {
printf("The ASCII code of the character '%c' is %d\n", input[i], (unsigned char)input[i]);
}
}
// Function to convert an Extended ASCII code to its corresponding character.
void asciiToCharacter(char *input) {
int charCode = atoi(input);
if (charCode < 0 || charCode > 255) {
printf("Invalid ASCII code. Must be between 0 and 255.\n");
} else {
printf("The ASCII character for code '%d' is '%c'\n", charCode, (char)charCode);
}
}
// Function to display the help message
void displayHelp() {
printf("Usage: %s [OPTIONS] [VALUE]\n", NAME);
printf("ASCII Decoder & Encoder.\n\n");
printf("Options:\n");
printf("\t-s, --string\tGive ASCII codes for each character in the input string.\n");
printf("\t-c, --code\tGive ASCII character for input code.\n");
printf("\t-h, --help\tDisplay this help message and exit.\n");
printf("\t-v, --version\tDisplay version and exit.\n");
}
// Function to display the version information
void displayVersion() {
printf("%s v%.1f\n", NAME, VERSION);
}