This is strings.c in view mode; [Download] [Up]
#define BUFSIZE 0x1000
char buff[BUFSIZE];
int fd,numleft;
char *cptr;
int block = 0;
#define TRUE 1
#define FALSE 0
/* The printing routines are a bit strange because this was written for
MSDOS, where there was significant savings in code size if you didn't
call printf.
*/
void ps(char *p) {while (*p) putchar(*p++);}
main(int argc, char **argv) {
int c;
char part[100];
int length,afterstring;
if (argc < 2) {
ps("Locate strings in a program:\nstrings <filename>\n");
exit(1);
}
if ((fd = open(argv[1],0)) < 0) {
ps("Unable to open "); ps(argv[1]); ps("\n");
exit(1);
}
numleft = 0;
length = 0; afterstring = FALSE;
while (1) {
if (!numleft) {
cptr++;
numleft = read(fd,buff,BUFSIZE);
if (numleft <= 0) {if (length) print(part,length); break;}
block++;
cptr = buff;
}
numleft--;
c = *cptr++;
/* see if we have the end of a string: */
if ((c == 0 || c == '\n') &&
length > (afterstring?1:part[0]=='N' ? 12:4)) {
part[length++] = c;
GOTONE:
print(part,length);
length = 0; afterstring = TRUE;
}
/* skip common 68000 garbage: */
else if (c=='N' && length && length<10 && part[length-1]!=' ') goto GARBAGE;
/* continue a string that is started: */
else if ((length || afterstring) &&
(c>=' ' && c<'\177' ||
(length>10 && c>'\240' && c<'\377') ||
c=='\n' || c=='\r' || c=='\t')) {
part[length++] = c;
if (length >= 70) goto GOTONE;
}
/* start a string: */
else if (c>='A' && c<='Z' || c>='a' && c<='z' || c=='%' || c=='#')
part[length++] = c;
else {
GARBAGE:
if (length > 10) {part[length++] = c; print(part,length);}
if (c) afterstring = FALSE;
length = 0;
}
}
close(fd);
}
_PutNum(unsigned value,int width) {
if (value>=16) _PutNum(value/16,width-1);
else while (--width > 0) putchar('0');
value %= 16;
putchar(value+((value>9)?'A'-10:'0'));
}
_PutOct(int value) {
putchar(((value>>6)&3)+'0');
putchar(((value>>3)&7)+'0');
putchar((value&7)+'0');
}
print(str,len)
char *str;
int len;
{
int x;
x = (cptr-buff)-len;
if (x < 0) {_PutNum(block-2,0); x += 0x1000;}
else _PutNum(block-1,0);
_PutNum(x,3);
ps(" : ");
while (len--) {
if (*str&128) {putchar('\\'); _PutOct(*str);}
else switch(*str) {
case '\n': ps("\\n"); break;
case '\r': ps("\\r"); break;
case '\t': ps("\\t"); break;
case '\\': ps("\\\\"); break;
case '^': ps("\\^"); break;
case 0: if (!len) break;
default:
if (*str < 32 || *str > 126) {putchar('^'); *str ^= 64;}
putchar(*str);
}
str++;
}
putchar('\n');
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.