论坛: 原创软件 标题: TomyChenComeon 复制本贴地址    
作者: NetDemon [netdemon]    ADMIN   登录
代码:

#ifndef lint
static const char copyright[] =
"@(#) Copyright (c) 1980, 1987, 1993\n\
        The Regents of the University of California.  All rights reserved.\n";
#endif /* not lint */

#ifndef lint
#if 0
static char sccsid[] = "@(#)strings.c   8.2 (Berkeley) 1/28/94";
#endif
static const char rcsid[] =
  "$FreeBSD: src/usr.bin/strings/strings.c,v 1.8.2.1 2001/03/04 09:05:54 kris Exp $";
#endif /* not lint */

#include <sys/types.h>

#include <a.out.h>
#include <ctype.h>
#include <err.h>
#include <fcntl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define DEF_LEN         4               /* default minimum string length */
#define ISSTR(ch)       (isalnum(ch) || ispunct(ch) || \
                         (isspace(ch) && (!iscntrl(ch) || ch == '\t')) || \
                         (isascii(ch) && isprint(ch)))

typedef struct exec     EXEC;           /* struct exec cast */

static long     foff;                   /* offset in the file */
static int      hcnt,                   /* head count */
                head_len,               /* length of header */
                read_len;               /* length to read */
static u_char   hbfr[sizeof(EXEC)];     /* buffer for struct exec */

int getch __P((void));
static void usage __P((void));

int
main(argc, argv)
        int argc;
        char **argv;
{
        register int ch, cnt;
        register u_char *C;
        EXEC *head;
        int exitcode, minlen;
        short asdata, oflg, fflg;
        u_char *bfr;
        char *file, *p;

        (void) setlocale(LC_CTYPE, "");

        /*
         * for backward compatibility, allow '-' to specify 'a' flag; no
         * longer documented in the man page or usage string.
         */
        asdata = exitcode = fflg = oflg = 0;
        minlen = -1;
        while ((ch = getopt(argc, argv, "-0123456789an:of")) != -1)
                switch (ch) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
                        /*
                         * kludge: strings was originally designed to take
                         * a number after a dash.
                         */
                        if (minlen == -1) {
                                p = argv[optind - 1];
                                if (p[0] == '-' && p[1] == ch && !p[2])
                                        minlen = atoi(++p);
                                else
                                        minlen = atoi(argv[optind] + 1);
                        }
                        break;
                case '-':
                case 'a':
                        asdata = 1;
                        break;
                case 'f':
                        fflg = 1;
                        break;
                case 'n':
                        minlen = atoi(optarg);
                        break;
                case 'o':
                        oflg = 1;
                        break;
                case '?':
                default:
                        usage();
                }
        argc -= optind;
        argv += optind;

        if (minlen == -1)
                minlen = DEF_LEN;
        else if (minlen < 1)
                errx(1, "length less than 1");

        if (!(bfr = malloc((u_int)minlen + 1)))
                errx(1, "malloc");
        bfr[minlen] = '\0';
        file = "stdin";
        do {
                if (*argv) {
                        file = *argv++;
                        if (!freopen(file, "r", stdin)) {
                                warn("%s", file);
                                exitcode = 1;
                                goto nextfile;
                        }
                }
                foff = 0;
#define DO_EVERYTHING()         {read_len = -1; head_len = 0; goto start;}
                read_len = -1;
                if (asdata)
                        DO_EVERYTHING()
                else {
                        head = (EXEC *)hbfr;
                        if ((head_len =
                            read(fileno(stdin), head, sizeof(EXEC))) == -1)
                                DO_EVERYTHING()
                        if (head_len == sizeof(EXEC) && !N_BADMAG(*head)) {
                                foff = N_TXTOFF(*head);
                                if (fseek(stdin, foff, SEEK_SET) == -1)
                                        DO_EVERYTHING()
                                read_len = head->a_text + head->a_data;
                                head_len = 0;
                        }
                        else
                                hcnt = 0;
                }
start:
                for (cnt = 0; (ch = getch()) != EOF;) {
                        if (ISSTR(ch)) {
                                if (!cnt)
                                        C = bfr;
                                *C++ = ch;
                                if (++cnt < minlen)
                                        continue;
                                if (fflg)
                                        printf("%s:", file);
                                if (oflg)
                                        printf("%07ld %s",
                                            foff - minlen, (char *)bfr);
                                else
                                        printf("%s", bfr);
                                while ((ch = getch()) != EOF && ISSTR(ch))
                                        putchar((char)ch);
                                putchar('\n');
                        }
                        cnt = 0;
                }
nextfile: ;
        } while (*argv);
        exit(exitcode);
}

/*
 * getch --
 *      get next character from wherever
 */
int
getch()
{
        ++foff;
        if (head_len) {
                if (hcnt < head_len)
                        return((int)hbfr[hcnt++]);
                head_len = 0;
        }
        if (read_len == -1 || read_len-- > 0)
                return(getchar());
        return(EOF);
}

static void
usage()
{
        (void)fprintf(stderr,
            "usage: strings [-afo] [-n length] [file ... ]\n");
        exit(1);
}



[此贴被 NetDemon(netdemon) 在 04月17日17时32分 编辑过]

地主 发表时间: 04/17 17:21

回复: ricky [ricky]   版主   登录
解释一下

B1层 发表时间: 04/17 19:03

回复: quest [quest]   版主   登录
老大,你知道把这段代码copy下来以后是什么样的吗?
55555555555555555555555555~~~~

B2层 发表时间: 04/17 19:28

回复: bking [bking]   版主   登录
555555555,说难听点:检子不是个东西了.
  老大别生气,我不是说你,我是说这个文章

B3层 发表时间: 04/17 20:01

回复: NetDemon [netdemon]   ADMIN   登录
shit~
tomy在QQ上管我要strings的源码,这个用QQ发太长,存文件又太短,就发这里给他了
大家看看也可以啊,虽然是简单的东西,不过不愧大家风范阿~~
Copy之后成什么样?

B4层 发表时间: 04/17 21:49

回复: NetDemon [netdemon]   ADMIN   登录
因为这个是在UNIX上copy下来的,而UNIX的和Windows的文本换行格式不一样,请p到vi上,或用UltraEdit建一个UNIX格式的再黏贴


[此贴被 NetDemon(netdemon) 在 04月18日00时42分 编辑过]

B5层 发表时间: 04/17 23:06

回复: quest [quest]   版主   登录
UltraEdit不行。
vi不行。
我觉得不是unix格式的问题,而是ubb代码转换后的问题。
把字符串合并成一行来处理。
难道linux的格式跟bsd的还有区别?



B6层 发表时间: 04/18 08:36

回复: NetDemon [netdemon]   ADMIN   登录
嗯~~~确实这样。
看来是论坛转换的原因了,我在论坛的程序上查查原因

想不到本人竟然为开源软件界作了件有意义的事哦,防拷贝技术
同时也为互联网的随便C&P通病提出了一件有效的防卫措施
值得恭喜阿同志们

B7层 发表时间: 04/18 13:11

回复: quest [quest]   版主   登录
这倒是实话:P

B8层 发表时间: 04/18 14:43

回复: bking [bking]   版主   登录
老大,快去申请专利!!快!!!!!!!!!!!!!!!!!!!!

B9层 发表时间: 04/18 16:07

论坛: 原创软件

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号