utilities/lib
This commit is contained in:
parent
ce8ac30706
commit
5fbbf96062
10
lib/banned.h
Normal file
10
lib/banned.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef _BANNED_H
|
||||||
|
# define BANNED_H
|
||||||
|
|
||||||
|
# define Use_of_this_function_is_not_permitted(a) invalid_token
|
||||||
|
# define BAN(a) Use_of_this_function_is_not_permitted(a)
|
||||||
|
|
||||||
|
# undef strcat
|
||||||
|
# define strcat(a,b) BAN(strcat)
|
||||||
|
|
||||||
|
#endif /* ifndef _BANNED_H */
|
BIN
lib/libcharin.o
Normal file
BIN
lib/libcharin.o
Normal file
Binary file not shown.
30
lib/libio.c
Normal file
30
lib/libio.c
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef _LIBIO_H
|
||||||
|
|
||||||
|
# define _LIBIO_H
|
||||||
|
|
||||||
|
int
|
||||||
|
fdputs(int fd, const char *s){
|
||||||
|
int i;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
for(i = 0; s[i] != '\0'; ++i);
|
||||||
|
|
||||||
|
/* DANGER */
|
||||||
|
s[i] = '\n';
|
||||||
|
r = write(fd, s, i + 1);
|
||||||
|
s[i] = '\0';
|
||||||
|
/* /danger */
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef _STDIO_H
|
||||||
|
|
||||||
|
int
|
||||||
|
puts(const char *s){
|
||||||
|
return fdputs(1, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* ifndef _STDIO_H */
|
||||||
|
|
||||||
|
#endif /* ifndef _LIBIO_H */
|
59
lib/libshell.c
Normal file
59
lib/libshell.c
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#include "libshell.h"
|
||||||
|
|
||||||
|
char **
|
||||||
|
getpaths(void)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
char **q;
|
||||||
|
char *path;
|
||||||
|
size_t path_s;
|
||||||
|
char *path_temp;
|
||||||
|
char **paths;
|
||||||
|
size_t paths_s;
|
||||||
|
|
||||||
|
if((path_temp = getenv(PATH_NAME)) == NULL){
|
||||||
|
errno = ENOMEM; /* Cannot allocate memory */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* How long is path? */
|
||||||
|
for(path_s = 0; path_temp[path_s] != '\0'; ++path_s);
|
||||||
|
/* path_s has the size of the path string, not including the null
|
||||||
|
* terminator */
|
||||||
|
|
||||||
|
/* getenv's return value mustn't be modified so copy it into memory we
|
||||||
|
* control */
|
||||||
|
if((path = malloc(sizeof(char) * (path_s + 1))) == NULL){
|
||||||
|
errno = ENOMEM; /* Cannot allocate memory */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(path, path_temp, path_s + 1);
|
||||||
|
path_temp = NULL;
|
||||||
|
path_s = 0; /* This shouldn't be necessary anymore */
|
||||||
|
|
||||||
|
/* How many paths in $PATH? */
|
||||||
|
for(paths_s = 1, p = path; *p != '\0'; paths_s += *p++ == PATH_DELIMITER);
|
||||||
|
|
||||||
|
if((paths = malloc(sizeof(char *) * (paths_s + 1))) == NULL){
|
||||||
|
free(path);
|
||||||
|
errno = ENOMEM; /* Cannot allocate memory */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace all instances of the path delimiter with 0, and then put the
|
||||||
|
* next path beginning into paths. */
|
||||||
|
/* This way we can get multiple strings out of one span of memory. */
|
||||||
|
for(*paths = p = path, q = paths + 1; *p != '\0';)
|
||||||
|
if(*p++ == PATH_DELIMITER){
|
||||||
|
*(p - 1) = '\0';
|
||||||
|
*q++ = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
paths[path_s] = NULL;
|
||||||
|
|
||||||
|
/* Because paths[0] will always be path, we can just free(*paths) at
|
||||||
|
* the end and discard path */
|
||||||
|
path = NULL;
|
||||||
|
|
||||||
|
return paths;
|
||||||
|
}
|
11
lib/libshell.h
Normal file
11
lib/libshell.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h> /* getenv(3), malloc(3) */
|
||||||
|
#include <string.h> /* memcpy(3) */
|
||||||
|
|
||||||
|
/* For the shell variable $PATH */
|
||||||
|
#define PATH_NAME "PATH"
|
||||||
|
#define PATH_DELIMITER ':'
|
||||||
|
|
||||||
|
/* Returns a list of the current paths ordered from first to last priority.
|
||||||
|
* output must be freed and *output must be freed! */
|
||||||
|
char **getpaths(void);
|
90
lib/libstr.c
Normal file
90
lib/libstr.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#include "libstr.h"
|
||||||
|
|
||||||
|
/* Use strchr in <string.h> */
|
||||||
|
/* char *charin(char c, char *str){ return strchr(str, c); } */
|
||||||
|
/* size_t charindex(char c, char *str){ return strchr(str, c) - str; } */
|
||||||
|
/* bool charisin(char c, char *str){ return strchr(str, c) == NULL; } */
|
||||||
|
|
||||||
|
/* lower bound is a limitation of mathematics,
|
||||||
|
* upper bound is controlled by how many digits are defined
|
||||||
|
* in the header */
|
||||||
|
#define CHECKBASE(b) ((b) >= 2 && base < (sizeof(ASCII_DIGITS_LOWER) / sizeof(*ASCII_DIGITS_LOWER))
|
||||||
|
|
||||||
|
int *
|
||||||
|
strtonumb(char *s, enum Strtype t, void *n, int base){
|
||||||
|
int i;
|
||||||
|
int polarity;
|
||||||
|
int retval;
|
||||||
|
retval = 0;
|
||||||
|
while(*s != '\0'){
|
||||||
|
if(!CHECKBASE(base))
|
||||||
|
return NULL;
|
||||||
|
/* assume *s is in ASCII_DIGITS_LOWER or ASCII_DIGITS_UPPER */
|
||||||
|
for(i = 0; i < base; ++i)
|
||||||
|
if(ASCII_DIGITS_LOWER[i] == *s
|
||||||
|
|| ASCII_DIGITS_UPPER == *s){
|
||||||
|
retval = retval * 10 + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(i == base)
|
||||||
|
return NULL;
|
||||||
|
++s;
|
||||||
|
}
|
||||||
|
*n = retval;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
stris(enum Strtype t, char *s){
|
||||||
|
return strisb(t, s, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
strisb(enum Strtype t, char *s, int base)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
retval = 0;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(!CHECKBASE(base))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* negatives */
|
||||||
|
if((t == STRIS_TYPE_FLOAT || t == STRIS_TYPE_INT) && *s == '-'){
|
||||||
|
++s;
|
||||||
|
if(t == STRIS_TYPE_INT)
|
||||||
|
t = STRIS_TYPE_UINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(*s != '\0')
|
||||||
|
switch(t){
|
||||||
|
case STRIS_TYPE_FLOAT:
|
||||||
|
if(*s == '.'){
|
||||||
|
++s;
|
||||||
|
t = STRIS_TYPE_UINT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
default:
|
||||||
|
for(i = 0; i < base; ++i)
|
||||||
|
if(ASCII_DIGITS_LOWER[i] == *s
|
||||||
|
|| ASCII_DIGITS_UPPER[i] == *s){
|
||||||
|
retval = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(i == base)
|
||||||
|
return 0;
|
||||||
|
++s;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int
|
||||||
|
strisb(enum Strtype t, char *s, int base){
|
||||||
|
int n;
|
||||||
|
return !(strtonumb(s, t, &n, base) == NULL);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
10
lib/libstr.h
Normal file
10
lib/libstr.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include "ascii.h"
|
||||||
|
|
||||||
|
enum Strtype{
|
||||||
|
STRIS_TYPE_UINT = 1,
|
||||||
|
STRIS_TYPE_INT,
|
||||||
|
STRIS_TYPE_FLOAT
|
||||||
|
};
|
||||||
|
|
||||||
|
int strisb(enum Strtype t, char *str, int base);
|
||||||
|
int stris(enum Strtype t, char *str);
|
21
lib/libwakeonlan.c
Normal file
21
lib/libwakeonlan.c
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "libwakeonlan.h"
|
||||||
|
|
||||||
|
/* Returns a byte array of 6 0xFF and 16 repetitions of the 6-byte MAC. */
|
||||||
|
unsigned int*
|
||||||
|
magic_packet(unsigned int *mac){
|
||||||
|
size_t i;
|
||||||
|
size_t j;
|
||||||
|
int *retval;
|
||||||
|
|
||||||
|
if((retval = malloc(sizeof(unsigned int) * 6 + 6*16)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for(i = 0; i < 6; ++i)
|
||||||
|
retval[i] = 255;
|
||||||
|
|
||||||
|
for(i = 1; i < 16; ++i)
|
||||||
|
for(j = 0; j < 6; ++j)
|
||||||
|
retval[i*j] = mac[j];
|
||||||
|
|
||||||
|
return retval; /* must be freed */
|
||||||
|
}
|
4
lib/libwakeonlan.h
Normal file
4
lib/libwakeonlan.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
unsigned int *magic_packet(unsigned int *mac);
|
7
lib/put.c
Normal file
7
lib/put.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/* A similar function appeared in the original ed(1). This was written clean as
|
||||||
|
* the original is no longer proprietary but now still encumbered by "BSD-like
|
||||||
|
* licensing" (Wikipedia). */
|
||||||
|
|
||||||
|
int
|
||||||
|
putd(int l, int d){
|
||||||
|
|
6
lib/test.c
Normal file
6
lib/test.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "banned.h"
|
||||||
|
int main(){
|
||||||
|
int *a, *b;
|
||||||
|
strcat(a, b);
|
||||||
|
}
|
30
lib/xml.h
Normal file
30
lib/xml.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/* There's already an excellent and popular XML library, libxml2, that
|
||||||
|
* accomplishes what this does but better. Use that instead. */
|
||||||
|
|
||||||
|
#define XML_LEFT_BRACKET '<'
|
||||||
|
#define XML_RIGHT_BRACKET '>'
|
||||||
|
#define XML_FORWARD_SLASH '/'
|
||||||
|
|
||||||
|
struct XMLAttribute{
|
||||||
|
char *name;
|
||||||
|
char *content;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct XMLDoc{
|
||||||
|
struct XMLNode **nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct XMLNode{
|
||||||
|
char *name;
|
||||||
|
char *content;
|
||||||
|
union{
|
||||||
|
struct XMLDoc *doc;
|
||||||
|
struct XMLNode *node;
|
||||||
|
}parent;
|
||||||
|
enum{
|
||||||
|
XML_PARENT_IS_DOC = 0,
|
||||||
|
XML_PARENT_IS_NODE = 1
|
||||||
|
}parent_type;
|
||||||
|
struct XMLAttribute **attributes;
|
||||||
|
struct XMLNode **children;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user