⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.c

📁 早期freebsd实现
💻 C
字号:
/* * $Source: /mit/kerberos/src/lib/des/RCS/misc.c,v $ * $Author: jtkohl $ * * Copyright 1988 by the Massachusetts Institute of Technology. * * For copying and distribution information, * please seethe file <mit-copyright.h>. * * This file contains most of the routines needed by the various * make_foo programs, to account for bit- and byte-ordering on * different machine types.  It also contains other routines useful in * generating the intermediate source files. */#include <mit-copyright.h>#include <stdio.h>#include "des_internal.h"/* * The DES algorithm is defined in terms of MSBFIRST, so sometimes, * e.g.  VAXes, we need to fix it up.  ANSI order means the DES * MSBFIRST order. */#if 0 /* These don't seem to get used anywhere.... */void swap_bits(array)    char *array;{#ifdef MSBFIRST    /* just return */    return;#else /* LSBFIRST */    register old,new,i,j;    /* for an eight byte block-- */    /* flips the bit order within each byte from 0 lsb to 0 msb */    for (i = 0; i<=7; i++) {        old = *array;        new = 0;        for (j = 0; j<=7; j++) {            new |= old & 01;    /* copy a bit */            if (j < 7) {                /* rotate in opposite directions */                old = old >> 1;                new = new << 1;            }        }        *array++ = new;    }#endif /* MSBFIRST */}unsigned long long_swap_bits(x)    unsigned long x;{#ifdef MSBFIRST    return x;#else    char *array = (char *) &x;    register old,new,i,j;    /* flips the bit order within each byte from 0 lsb to 0 msb */    for (i = 0; i <= (sizeof(long)-1); i++) {        old = *array;        new = 0;        for (j = 0; j<=7; j++) {            if (old & 01)                new = new | 01;            if (j < 7) {                old = old >> 1;                new = new << 1;            }        }        *array++ = new;    }    return x;#endif /* LSBFIRST */}#endif /* 0 */unsigned long swap_six_bits_to_ansi(old)    unsigned long old;{    register unsigned long new, j;    /* flips the bit order within each byte from 0 lsb to 0 msb */    new = 0;    for (j = 0; j<=5; j++) {        new |= old & 01;        /* copy a bit */        if (j < 5) {            /* rotate in opposite directions */            old = old >> 1;            new = new << 1;        }    }    return new;}unsigned long swap_four_bits_to_ansi(old)    unsigned long old;{    register unsigned long new,j;    /* flips the bit order within each byte from 0 lsb to 0 msb */    new = 0;    for (j = 0; j<=3; j++) {        new |= (old & 01);      /* copy a bit */        if (j < 3) {            old = old >> 1;            new = new << 1;        }    }    return new;}unsigned long swap_bit_pos_1(x)    unsigned long x;{    /*     * This corrects for the bit ordering of the algorithm, e.g.     * bit 0 ==> msb, bit 7 lsb.     *     * given the number of a bit position, >=1, flips the bit order     * each byte. e.g. bit 3 --> bit 6, bit 13 --> bit 12     */    register y,z;    /* always do it, only used by des_make_key_perm.c so far */    y = (x-1)/8;    z = (x-1)%8;    x = (8-z) + (y*8);    return x;}unsigned long swap_bit_pos_0(x)    unsigned long x;{    /*  zero based version */    /*     * This corrects for the bit ordering of the algorithm, e.g.     * bit 0 ==> msb, bit 7 lsb.     */#ifdef MSBFIRST    return x;#else /* LSBFIRST */    register y,z;    /*     * given the number of a bit position, >=0, flips the bit order     * each byte. e.g. bit 3 --> bit 6, bit 13 --> bit 12     */    y = x/8;    z = x%8;    x = (7-z) + (y*8);    return x;#endif /* LSBFIRST */}unsigned long swap_bit_pos_0_to_ansi(x)    unsigned long x;{    /* zero based version */    /*     * This corrects for the bit ordering of the algorithm, e.g.     * bit 0 ==> msb, bit 7 lsb.     */    register y,z;    /*     * given the number of a bit position, >=0, flips the bit order each     * byte. e.g. bit 3 --> bit 6, bit 13 --> bit 12     */    y = x/8;    z = x%8;    x = (7-z) + (y*8);    return x;}unsigned long rev_swap_bit_pos_0(x)    unsigned long x;{    /* zero based version */    /*     * This corrects for the bit ordering of the algorithm, e.g.     *  bit 0 ==> msb, bit 7 lsb.     *     * Role of LSB and MSB flipped from the swap_bit_pos_0()     */#ifdef LSBFIRST    return x;#else /* MSBFIRST */    register y,z;    /*     * given the number of a bit position, >=0, flips the bit order each     * byte. e.g. bit 3 --> bit 6, bit 13 --> bit 12     */    y = x/8;    z = x%8;    x = (7-z) + (y*8);    return x;#endif /* MSBFIRST */}unsigned long swap_byte_bits(x)    unsigned long x;{#ifdef MSBFIRST    return x;#else /* LSBFIRST */    char *array = (char *) &x;    register unsigned long old,new,j;    /* flips the bit order within each byte from 0 lsb to 0 msb */    old = *array;    new = 0;    for (j = 0; j<=7; j++) {        new |= (old & 01);      /* copy a bit */        if (j < 7) {            old = old >> 1;            new = new << 1;        }    }    return new;#endif /* LSBFIRST */}swap_long_bytes_bit_number(x)    unsigned long x;{    /*     * given a bit number (0-31) from a vax, swap the byte part of the     * bit number to change the byte ordering to mSBFIRST type     */#ifdef LSBFIRST    return x;#else /* MSBFIRST */    unsigned long y,z;    y = x/8;                    /* initial byte component */    z = x%8;                    /* bit within byte */    x = (3-y)*8 +z;    return x;#endif /* MSBFIRST */}void test_set(stream, src, testbit, dest, setbit)    FILE *stream;    const char *src;    int testbit;    const char *dest;    int setbit;{#ifdef DES_SHIFT_SHIFT    if (testbit == setbit)        fprintf(stream, "    %s |=  %s & (1<<%2d);\n",                dest, src, testbit);    else        fprintf(stream, "    %s |= (%s & (1<<%2d)) %s %2d;\n",                dest, src, testbit,                (testbit < setbit) ? "<<" : ">>",                abs(testbit - setbit));#else    fprintf(stream,            "    if (%s & (1<<%2d))  %s |= 1<<%2d;\n",            src, testbit, dest, setbit);#endif}extern void gen PROTOTYPE((FILE * stream));int des_debug;char const *whoami;main(argc, argv)    int argc;    char *argv[];{    char *filename;    char *arg;    FILE * stream;    whoami = argv[0];    filename = (char *)NULL;    while (argc--, *++argv) {        arg = *argv;        if (*arg == '-') {            if (!strcmp(arg, "-d") && !strcmp(arg, "-debug"))                des_debug++;            else {                fprintf(stderr, "%s: unknown control argument %s\n",                        whoami, arg);                goto usage;            }        }        else if (filename) {            fprintf(stderr,                    "%s: multiple file names provided: %s, %s\n",                    whoami, filename, arg);            goto usage;        }        else            filename = arg;    }    if (!filename) {        fprintf(stderr, "%s: no file name provided\n", whoami);        goto usage;    }    stream = fopen(filename, "w");    if (!stream) {        perror(filename);    usage:        fprintf(stderr, "usage: %s [-debug] filename\n", whoami);        exit(1);    }    fputs(      "/* This file is automatically generated.  Do not edit it. */\n",          stream);    /* This routine will generate the contents of the file. */    gen(stream);    if (fclose(stream) == EOF) {        perror(filename);        exit(1);    }    exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -