/****************************************************************************
 * NCSA Mosaic for the X Window System                                      *
 * Software Development Group                                               *
 * National Center for Supercomputing Applications                          *
 * University of Illinois at Urbana-Champaign                               *
 * 605 E. Springfield, Champaign IL 61820                                   *
 * mosaic@ncsa.uiuc.edu                                                     *
 *                                                                          *
 * Copyright (C) 1993, Board of Trustees of the University of Illinois      *
 *                                                                          *
 * NCSA Mosaic software, both binary and source (hereafter, Software) is    *
 * copyrighted by The Board of Trustees of the University of Illinois       *
 * (UI), and ownership remains with the UI.                                 *
 *                                                                          *
 * The UI grants you (hereafter, Licensee) a license to use the Software    *
 * for academic, research and internal business purposes only, without a    *
 * fee.  Licensee may distribute the binary and source code (if released)   *
 * to third parties provided that the copyright notice and this statement   *
 * appears on all copies and that no charge is associated with such         *
 * copies.                                                                  *
 *                                                                          *
 * Licensee may make derivative works.  However, if Licensee distributes    *
 * any derivative work based on or derived from the Software, then          *
 * Licensee will (1) notify NCSA regarding its distribution of the          *
 * derivative work, and (2) clearly notify users that such derivative       *
 * work is a modified version and not the original NCSA Mosaic              *
 * distributed by the UI.                                                   *
 *                                                                          *
 * Any Licensee wishing to make commercial use of the Software should       *
 * contact the UI, c/o NCSA, to negotiate an appropriate license for such   *
 * commercial use.  Commercial use includes (1) integration of all or       *
 * part of the source code into a product for sale or license by or on      *
 * behalf of Licensee to third parties, or (2) distribution of the binary   *
 * code or source code to third parties that need it to utilize a           *
 * commercial product sold or licensed by or on behalf of Licensee.         *
 *                                                                          *
 * UI MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR   *
 * ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED          *
 * WARRANTY.  THE UI SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY THE    *
 * USERS OF THIS SOFTWARE.                                                  *
 *                                                                          *
 * By using or copying this Software, Licensee agrees to abide by the       *
 * copyright law and all other applicable laws of the U.S. including, but   *
 * not limited to, export control laws, and the terms of this license.      *
 * UI shall have the right to terminate this license immediately by         *
 * written notice upon Licensee's breach of, or non-compliance with, any    *
 * of its terms.  Licensee may be held legally responsible for any          *
 * copyright infringement that is caused or encouraged by Licensee's        *
 * failure to abide by the terms of this license.                           *
 *                                                                          *
 * Comments and questions are welcome and can be sent to                    *
 * mosaic-x@ncsa.uiuc.edu.                                                  *
 ****************************************************************************/

/* Note that this code is taken almost straight from the httpd cgi-src
	directory.*/

#include "../config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#ifndef LF
#define LF 10
#endif
#ifndef CR
#define CR 13
#endif


void getword(char *word, char *line, char stop) {
    int x = 0, y;

    for (x=0; ((line[x]) && (line[x] != stop)); x++)
        word[x] = line[x];

    word[x] = '\0';
    if (line[x]) ++x;
    y = 0;

    while (line[y++] = line[x++]);
}


char *makeword(char *line, char stop) {
    int x = 0, y;
    char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));

    for (x=0; ((line[x]) && (line[x] != stop)); x++)
        word[x] = line[x];

    word[x] = '\0';
    if (line[x]) ++x;
    y = 0;

    while (line[y++] = line[x++]);
    return word;
}


char *fmakeword(FILE *f, char stop, int *cl) {
    int wsize;
    char *word;
    int ll;

    wsize = 102400;
    ll = 0;
    word = (char *) malloc(sizeof(char) * (wsize + 1));

    while (1) {
        word[ll] = (char)fgetc(f);
        if (ll == wsize) {
            word[ll+1] = '\0';
            wsize += 102400;
            word = (char *)realloc(word, sizeof(char)*(wsize+1));
        }
        --(*cl);
        if ((word[ll] == stop) || (feof(f)) || (!(*cl))) {
            if (word[ll] != stop) ll++;
            word[ll] = '\0';
            return word;
        }
        ++ll;
    }
}


char x2c(char *what) {
    register char digit;

    digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
    digit *= 16;
    digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
    return(digit);
}


void unescape_url(char *url) {
    register int x,y;

    for (x=0, y=0; url[y]; ++x, ++y) {
        if ((url[x] = url[y]) == '%') {
            url[x] = x2c(&url[y+1]);
            y += 2;
        }
    }
    url[x] = '\0';
}


void plustospace(char *str) {
    register int x;

    for (x=0; str[x]; x++) if (str[x] == '+') str[x] = ' ';
}


int rind(char *s, char c) {
    register int x;
    for (x = strlen(s) - 1; x != -1; x--)
        if (s[x] == c) return x;
    return -1;
}


int getline(char *s, int n, FILE *f) {
    register int i = 0;

    while (1) {
        s[i] = (char)fgetc(f);

        if (s[i] == CR)
            s[i] = fgetc(f);

        if ((s[i] == 0x4) || (s[i] == LF) || (i == (n-1))) {
            s[i] = '\0';
            return (feof(f) ? 1 : 0);
        }
        ++i;
    }
}


void send_fd(FILE *f, FILE *fd)
{
    int num_chars = 0;
    char c;

    while (1) {
        c = fgetc(f);
        if (feof(f))
            return;
        fputc(c, fd);
    }
}


int ind(char *s, char c) {
    register int x;

    for (x=0; s[x]; x++)
        if (s[x] == c) return x;

    return -1;
}


void escape_shell_cmd(char *cmd) {
    register int x, y, l;

    l = strlen(cmd);
    for (x=0; cmd[x]; x++) {
        if (ind("&;`'\"|*?~<>^()[]{}$\\", cmd[x]) != -1) {
            for (y=l+1; y>x; y--)
                cmd[y] = cmd[y-1];
            l++; /* length has been increased */
            cmd[x] = '\\';
            x++; /* skip the character */
        }
    }
}
