-void
-extract_mangle(head)
-union record *head;
-{
- char *buf;
- char *fromtape;
- char *to;
- char *ptr,*ptrend;
- char *nam1,*nam1end;
- int size;
- int copied;
-
- size=hstat.st_size;
- buf=to=ck_malloc(size+1);
- buf[size]='\0';
- while(size>0) {
- fromtape=findrec()->charptr;
- if(fromtape==0) {
- msg("Unexpected EOF in mangled names!");
- return;
- }
- copied=endofrecs()->charptr-fromtape;
- if(copied>size)
- copied=size;
- bcopy(fromtape,to,copied);
- to+=copied;
- size-=copied;
- userec((union record *)(fromtape+copied-1));
- }
- for(ptr=buf;*ptr;ptr=ptrend) {
- ptrend=index(ptr,'\n');
- *ptrend++='\0';
-
- if(!strncmp(ptr,"Rename ",7)) {
- nam1=ptr+7;
- nam1end=index(nam1,' ');
- while(strncmp(nam1end," to ",4)) {
- nam1end++;
- nam1end=index(nam1end,' ');
- }
- *nam1end='\0';
- if(ptrend[-2]=='/')
- ptrend[-2]='\0';
- un_quote_string(nam1end+4);
- if(rename(nam1,nam1end+4))
- msg_perror("Can't rename %s to %s",nam1,nam1end+4);
- else if(f_verbose)
- msg("Renamed %s to %s",nam1,nam1end+4);
- }
-#ifdef S_ISLNK
- else if(!strncmp(ptr,"Symlink ",8)) {
- nam1=ptr+8;
- nam1end=index(nam1,' ');
- while(strncmp(nam1end," to ",4)) {
- nam1end++;
- nam1end=index(nam1end,' ');
- }
- *nam1end = '\0';
- un_quote_string(nam1);
- un_quote_string(nam1end+4);
- if(symlink(nam1,nam1end+4) && (unlink(nam1end+4) || symlink(nam1,nam1end+4)))
- msg_perror("Can't symlink %s to %s",nam1,nam1end+4);
- else if(f_verbose)
- msg("Symlinkd %s to %s",nam1,nam1end+4);
- }
-#endif
- else
- msg("Unknown demangling command %s",ptr);
- }