// #include"reaction.h" int main() { ////////Input Parameters of the potential (fit parameters) ///// std::string parameters_filename="Input.inp"; NuclearParameters Nu = read_nucleus_parameters( "Input/pca40.inp" ); double Ef=Nu.Ef; int lmax=5; double z0=20.0; double zp0; double A0=40.0; double tz=0.5; int type=1; int mvolume = 4; int AsyVolume = 1; double A = 40.0; if (tz>0) { zp0=1;} else {zp0=0;} double ph_gap = Nu.ph_gap; double rStart = .05; double rmax = 12.; double ham_pts = 180; double rdelt = rmax / ham_pts; // Construct Parameters Object Parameters p = get_parameters( parameters_filename, Nu.A, Nu.Z, zp0 ); // Construct Potential Object pot pottt = get_bobs_pot2( type, mvolume, AsyVolume, tz, Nu, p ); pot * pott = &pottt; // store coulomb potential in order to compare with boundRspace initiate(rmax , ham_pts , Ef, ph_gap , lmax , Nu.Z , zp0 , Nu.A , pott); double Elower = -11.61818; double Eupper = -9.4; double jj = .5; int ll = 0; int Ifine = 1; initiate.searchNonLoc( Elower, Eupper, jj, ll, Ifine); initiate.exteriorWaveFunct(ll); initiate.normalizeWF(); double tol=.01; double estart=Ef; ///// Making rmesh/// // std::vector<double> rmesh_p= initiate.make_rmesh_point(); std::vector<double> rmesh_p= initiate.make_rmesh_point(); std::vector<double> rmesh= initiate.make_rmesh(); //////////////////////////// //// s and d wave functions//// /////////////////////////// int N = 0; int L = 1; double J = 0.5; double Emax=2*-4.7; double Emin=-200.0 + Emax; eigen_t waves0=initiate.find_boundstate(rmesh_p, estart,0,L,J,tol); eigen_t waves1=initiate.find_boundstate(rmesh_p, estart,1,L,J,tol); eigen_t waves2=initiate.find_boundstate(rmesh_p, estart,2,L,J,tol); eigen_t waves3=initiate.find_boundstate(rmesh_p, estart,3,L,J,tol); eigen_t waves4=initiate.find_boundstate(rmesh_p, estart,4,L,J,tol); eigen_t waves5=initiate.find_boundstate(rmesh_p, estart,5,L,J,tol); eigen_t waves6=initiate.find_boundstate(rmesh_p, estart,6,0,0.5,tol); std::ofstream filee("waves/wave.out"); std::cout<<Elower<<std::endl; ////////// //////////// // Plottinge Pot and wavefuntionsa and their log// // and also the derivitaves ////////////////////// double norm0=0,norm1=0,norm2=0,norm3=0,norm4=0,norm5=0,norm6=0; double normAsymp_s = 0.; double normAsymp_d = 0.; double Mproton = 931.5;// 937.27; double normbob= 0.; //double Ed = -waves_d.first; //double Es = -waves_s.first; //double bbetta_d = std::sqrt(2. * Mproton * (40./41.) * Ed /(197. * 197.)); //double bbetta_s = std::sqrt(2. * Mproton * (40./41.) * Es /(197. * 197.)); //double llambbda = 2.0 * Mproton * (40./41.) * 1.44 * 19. /(197. * 197.); for(int ii=0;ii<rmesh_p.size();++ii){ norm0 += rdelt * std::pow(rmesh_p[ii] * waves0.second[ii],2) ; norm1 += rdelt * std::pow(rmesh_p[ii] * waves1.second[ii],2) ; norm2 += rdelt * std::pow(rmesh_p[ii] * waves2.second[ii],2) ; norm3 += rdelt * std::pow(rmesh_p[ii] * waves3.second[ii],2) ; norm4 += rdelt * std::pow(rmesh_p[ii] * waves4.second[ii],2) ; norm5 += rdelt * std::pow(rmesh_p[ii] * waves5.second[ii],2) ; norm6 += rdelt * std::pow(rmesh_p[ii] * waves6.second[ii],2) ; //normAsymp_s += rdelt * std::pow((exp(-bbetta_s * rmesh_p[ii]) * std::pow(rmesh_p[ii], -llambbda /( 2.0 * bbetta_s))) ,2); //normAsymp_d += rdelt * std::pow((exp(-bbetta_d * rmesh_p[ii]) * std::pow(rmesh_p[ii], -llambbda /( 2.0 * bbetta_d))) ,2); //normbob += rdelt * std::pow(rmesh_p[ii] * initiate.WaveArray[ii],2); } /////////////////////// ADDING CODE FOR SPECTRAL FUNCTION FOLDING WITH SKYRME //////////////////////// int index=initiate.index_from_LJ(L,J); std::vector< lj_eigen_t > bound_levels = initiate.get_bound_levels( rmesh, tol ); std::vector< mesh_t > emesh_vec = initiate.get_emeshes( rmesh, Emin, Emax, bound_levels ); cout<<"emesh_vec = "<<emesh_vec.size()<<endl; std::vector< prop_t > prop_vec = initiate.get_propagators( rmesh, emesh_vec ); const prop_t &propE = prop_vec.at(index); const mesh_t &emesh = emesh_vec.at(index); std::vector< double > bspec = initiate.spectral_strength( L, J, rmesh, emesh_vec, prop_vec ); mesh_t energym = initiate.get_lj_emesh(L,J,emesh_vec ); eigen_t bound_info = initiate.find_boundstate( rmesh, estart, N, L, J, tol ); std::vector< double > &QPF = bound_info.second; double QPE = bound_info.first; double S = initiate.sfactor( rmesh, QPE, L, J, QPF ); std::vector< double > chd = initiate.charge_density(rmesh, Emax, emesh_vec, prop_vec, bound_levels); vector <double> pdist = initiate.point_distribution(rmesh_p,Emax,emesh_vec,prop_vec,bound_levels); matrix_t d_mtx( rmesh.size(), rmesh.size() ); // density matrix d_mtx.clear(); //making it so that wavefunction takes skyrme wavefunction as the input and finds the skyrme spectral function std::ifstream filein("waves/upp12.txt"); double skyrme[rmesh.size()]; std::string line; double part=0; double part2=0; for(int i=0;i<rmesh.size();i++){ part += chd[i] * rdelt * pow(rmesh[i],2) * 4 * M_PI; part2 += pdist[i] * rdelt * pow(rmesh[i],2) * 4 * M_PI; } cout<<"Particle Number = "<<part<<endl; cout<<"Particle Number2 = "<<part2<<endl; int iii; iii=0; while(getline(filein,line)){ skyrme[iii]=atof(line.c_str()); iii++; } filein.close(); int esize; esize=emesh.size(); std::vector<double> spec; std::vector<double> spec2; std::vector <double> dom0,dom1,dom2,dom3,dom4,dom5,dom6; double dwave0,dwave1,dwave2,dwave3,dwave4,dwave5,dwave6; for(int i=0;i<rmesh.size();i++){ dwave0=rmesh[i]*waves0.second[i]/norm0; dom0.push_back(dwave0); dwave1=rmesh[i]*waves1.second[i]/norm1; dom1.push_back(dwave1); dwave2=rmesh[i]*waves2.second[i]/norm2; dom2.push_back(dwave2); dwave3=rmesh[i]*waves3.second[i]/norm3; dom3.push_back(dwave3); dwave4=rmesh[i]*waves4.second[i]/norm4; dom4.push_back(dwave4); dwave5=rmesh[i]*waves5.second[i]/norm5; dom5.push_back(dwave5); dwave6=rmesh[i]*waves6.second[i]/norm6; dom6.push_back(dwave6); } //Remember that propE is actually G*r*r'*rdelt for(unsigned int n=0;n<emesh.size();++n){ double spf=0.0; double spf2=0.0; double Edelt=emesh[n].second; for( unsigned int i = 0; i < rmesh.size(); ++i ) { for( unsigned int j = 0; j < rmesh.size(); ++j ) { //d_mtx(i,j) += Edelt * imag(propE[n](i,j)) / (M_PI * rmesh[i] * rmesh[j] * rdelt); d_mtx(i,j) += Edelt * imag(propE[n](i,j)) / M_PI; spf -= rdelt * skyrme[i] * skyrme[j] *imag( propE[n]( i, j ) ) / M_PI; spf2 -= rdelt * dom0[i]*dom0[j] *imag( propE[n]( i, j ) ) / M_PI; //spf -= rmesh[i] * rmesh[j] * rdelt / M_PI // * QPF[i] * QPF[j] * imag( propE[n]( i, j ) ); } } spec.push_back(spf); spec2.push_back(spf2); } std::ofstream fmtx("waves/dmtx.txt"); for(int i=0;i<rmesh.size();i++){ for(int j=0;j<rmesh.size();j++){ fmtx<<d_mtx(i,j)<<" "; } fmtx<<endl; } fmtx.close(); std::vector <eigen_t> eig = initiate.real_eigvecs(d_mtx); double norme=0.0; double norm=0.0; double eigsum=0.0; double maxeig=0.0; norm0=0,norm1=0,norm2=0,norm3=0,norm4=0,norm5=0,norm6=0; for(int i=0;i<rmesh.size();++i){ norm0 += rdelt * pow( eig[0].second[i],2); norm1 += rdelt * pow( eig[1].second[i],2); norm2 += rdelt * pow( eig[2].second[i],2); norm3 += rdelt * pow( eig[3].second[i],2); norm4 += rdelt * pow( eig[4].second[i],2); } double occ=0.0; for (int i=0;i<rmesh.size();++i){ for (int j=0;j<rmesh.size();++j){ occ += rdelt*rdelt * d_mtx(i,j) * eig[N].second[i]/std::sqrt(norm) * eig[N].second[j]/std::sqrt(norm) * pow(rmesh[i],2) * pow(rmesh[j],2); } } //cout<<"QP OCCUPATION NUMBER = "<<initiate.occupation(rmesh,d_mtx,QPF)<<endl; //cout<<"occupation number = "<<occ<<endl; ofstream fval("waves/i13 2.txt"); fval<<eig[0].first*-1<<std::endl; fval<<eig[1].first*-1<<std::endl; fval<<eig[2].first*-1<<endl; fval<<eig[3].first*-1<<endl; fval<<eig[4].first*-1<<endl; std::ofstream feig("waves/eig.out"); //std::cout<<"Here is an eigenvector"<<std::endl; double esum=0.0; for(int i=0;i<rmesh.size();++i){ //want to give R(r), so print out u(r)/r feig<<rmesh[i]<<" "<<eig[0].second[i]/sqrt(norm0)/rmesh[i]; feig<<" "<<eig[1].second[i]/sqrt(norm1)/rmesh[i]; feig<<" "<<eig[2].second[i]/sqrt(norm2)/rmesh[i]; feig<<" "<<eig[3].second[i]/sqrt(norm3)/rmesh[i]; feig<<" "<<eig[4].second[i]/sqrt(norm4)/rmesh[i]<<endl;; // esum += rdelt*pow(rmesh[i]*eig[N].second[i]/sqrt(norme),2); } //std::cout<<"esum = "<<esum<<std::endl; //This is where I will find rhobar, ask houssein how to put in clebsch gordon and spherical harmonics double dens=0.0; int nt=50; int np=25; double dt=2*M_PI/nt; double dp=M_PI/np; for(int i=0;i<rmesh.size();i++){ for(int j=0;j<nt;j++){ for(int k=0;k<np;k++){ dens+= rdelt*rdelt * skyrme[i]*skyrme[i] * chd[i]; //* spherical harmonics and clebsch gordon * sin(theta) } } } std::vector< double > s_of_Eqh = initiate.spectral_strength_QH( L, J, rmesh, emesh_vec, prop_vec, QPF); std::ofstream fden("waves/chd.out"); ofstream fpoint("waves/p.out"); std::ofstream fileout("waves/spec.out"); std::ofstream files("waves/skyrme.out"); std::ofstream fileq("waves/quasi.out"); std::ofstream filef("waves/fold.out"); std::ofstream filed("waves/dom.out"); std::ofstream filer("waves/r.out"); //std::ofstream filep("waves/prop.out"); for(int i=0;i<rmesh.size();i++){ files<<skyrme[i]<<endl; fileq<<QPF[i]<<endl; filer<<rmesh[i]<<" "<<rmesh_p[i]<<endl; fden<<rmesh[i]<<" "<<chd[i]<<endl; fpoint<<rmesh[i]<<" "<<pdist[i]<<endl; } for(int i=0;i<bspec.size();i++){ fileout<<energym[i].first<<" "<<energym[i].second<<" "<<spec[i]<<endl; filed<<energym[i].first<<" "<<energym[i].second<<" "<<spec2[i]<<endl; filef<<energym[i].first<<" "<<energym[i].second<<" "<<s_of_Eqh[i]<<endl; } filed.close(); filer.close(); filef.close(); fileq.close(); files.close(); fileout.close(); /////////// END OF ADDED CODE /////////////////////////////////////// //////// //normalizing wavefunctions at 4.008 to s wave to compare the asymptotic behaviour and energy //the value of s at 4.008 is .023309//d is .132997 , s_asymp is .000271922 , d_asymp i s .000336918 ///////// for(int ii=0;ii<rmesh.size();++ii){ filee<<dom0[ii]/rmesh[ii]<<" "<<dom1[ii]<<" "<<dom2[ii]<<" "<<dom3[ii]<<" "<<dom4[ii]<<" "<<dom5[ii]<<std::endl; } //std::cout <<"Es =" << waves_s.first << " " << "Ed= " << waves_d.first <<std::endl; //std::cout << zp0 << " " << tz<<" "<<norm_s<<" "<< norm_d<<" "<< normAsymp_s<<" norm bob=" << normbob<< std::endl; //std::cout <<"Elower = "<< Elower <<" " << "Eupper = " << Eupper<<std::endl; filee.close(); std::cout<<"Spectral Factor = "<<S<<endl; std::cout<<"Quasi-hole Energy = "<<QPE<<endl; return 0; }
int ed_expand(Edit_t *ep, char outbuff[],int *cur,int *eol,int mode, int count) { struct comnod *comptr; struct argnod *ap; register char *out; char *av[2], *begin , *dir=0; int addstar=0, rval=0, var=0, strip=1; int nomarkdirs = !sh_isoption(SH_MARKDIRS); sh_onstate(SH_FCOMPLETE); if(ep->e_nlist) { if(mode=='=' && count>0) { if(count> ep->e_nlist) return(-1); mode = '?'; av[0] = ep->e_clist[count-1]; av[1] = 0; } else { stakset(ep->e_stkptr,ep->e_stkoff); ep->e_nlist = 0; } } comptr = (struct comnod*)stakalloc(sizeof(struct comnod)); ap = (struct argnod*)stakseek(ARGVAL); #if SHOPT_MULTIBYTE { register int c = *cur; register genchar *cp; /* adjust cur */ cp = (genchar *)outbuff + *cur; c = *cp; *cp = 0; *cur = ed_external((genchar*)outbuff,(char*)stakptr(0)); *cp = c; *eol = ed_external((genchar*)outbuff,outbuff); } #endif /* SHOPT_MULTIBYTE */ out = outbuff + *cur + (sh_isoption(SH_VI)!=0); if(out[-1]=='"' || out[-1]=='\'') { rval = -(sh_isoption(SH_VI)!=0); goto done; } comptr->comtyp = COMSCAN; comptr->comarg = ap; ap->argflag = (ARG_MAC|ARG_EXP); ap->argnxt.ap = 0; ap->argchn.cp = 0; { register int c; char *last = out; c = *(unsigned char*)out; var = mode; begin = out = find_begin(outbuff,last,0,&var); /* addstar set to zero if * should not be added */ if(var=='$') { stakputs("${!"); stakwrite(out,last-out); stakputs("@}"); out = last; } else { addstar = '*'; while(out < last) { c = *(unsigned char*)out; if(isexp(c)) addstar = 0; if (c == '/') { if(addstar == 0) strip = 0; dir = out+1; } stakputc(c); out++; } } if(mode=='?') mode = '*'; if(var!='$' && mode=='\\' && out[-1]!='*') addstar = '*'; if(*begin=='~' && !strchr(begin,'/')) addstar = 0; stakputc(addstar); ap = (struct argnod*)stakfreeze(1); } if(mode!='*') sh_onoption(SH_MARKDIRS); { register char **com; char *cp=begin, *left=0, *saveout="."; int nocase=0,narg,cmd_completion=0; register int size='x'; while(cp>outbuff && ((size=cp[-1])==' ' || size=='\t')) cp--; if(!var && !strchr(ap->argval,'/') && (((cp==outbuff&&ep->sh->nextprompt==1) || (strchr(";&|(",size)) && (cp==outbuff+1||size=='('||cp[-2]!='>') && *begin!='~' ))) { cmd_completion=1; sh_onstate(SH_COMPLETE); } if(ep->e_nlist) { narg = 1; com = av; if(dir) begin += (dir-begin); } else { com = sh_argbuild(ep->sh,&narg,comptr,0); /* special handling for leading quotes */ if(begin>outbuff && (begin[-1]=='"' || begin[-1]=='\'')) begin--; } sh_offstate(SH_COMPLETE); /* allow a search to be aborted */ if(ep->sh->trapnote&SH_SIGSET) { rval = -1; goto done; } /* match? */ if (*com==0 || (narg <= 1 && (strcmp(ap->argval,*com)==0) || (addstar && com[0][strlen(*com)-1]=='*'))) { rval = -1; goto done; } if(mode=='\\' && out[-1]=='/' && narg>1) mode = '='; if(mode=='=') { if (strip && !cmd_completion) { register char **ptrcom; for(ptrcom=com;*ptrcom;ptrcom++) /* trim directory prefix */ *ptrcom = path_basename(*ptrcom); } sfputc(sfstderr,'\n'); sh_menu(sfstderr,narg,com); sfsync(sfstderr); ep->e_nlist = narg; ep->e_clist = com; goto done; } /* see if there is enough room */ size = *eol - (out-begin); if(mode=='\\') { int c; if(dir) { c = *dir; *dir = 0; saveout = begin; } if(saveout=astconf("PATH_ATTRIBUTES",saveout,(char*)0)) nocase = (strchr(saveout,'c')!=0); if(dir) *dir = c; /* just expand until name is unique */ size += strlen(*com); } else { size += narg; { char **savcom = com; while (*com) size += strlen(cp=fmtx(*com++)); com = savcom; } } /* see if room for expansion */ if(outbuff+size >= &outbuff[MAXLINE]) { com[0] = ap->argval; com[1] = 0; } /* save remainder of the buffer */ if(*out) left=stakcopy(out); if(cmd_completion && mode=='\\') out = strcopy(begin,path_basename(cp= *com++)); else if(mode=='*') { if(ep->e_nlist && dir && var) { if(*cp==var) cp++; else *begin++ = var; out = strcopy(begin,cp); var = 0; } else out = strcopy(begin,fmtx(*com)); com++; } else out = strcopy(begin,*com++); if(mode=='\\') { saveout= ++out; while (*com && *begin) { if(cmd_completion) out = overlaid(begin,path_basename(*com++),nocase); else out = overlaid(begin,*com++,nocase); } mode = (out==saveout); if(out[-1]==0) out--; if(mode && out[-1]!='/') { if(cmd_completion) { Namval_t *np; /* add as tracked alias */ Pathcomp_t *pp; if(*cp=='/' && (pp=path_dirfind(ep->sh->pathlist,cp,'/')) && (np=nv_search(begin,ep->sh->track_tree,NV_ADD))) path_alias(np,pp); out = strcopy(begin,cp); } /* add quotes if necessary */ if((cp=fmtx(begin))!=begin) out = strcopy(begin,cp); if(var=='$' && begin[-1]=='{') *out = '}'; else *out = ' '; *++out = 0; } else if((cp=fmtx(begin))!=begin) { out = strcopy(begin,cp); if(out[-1] =='"' || out[-1]=='\'') *--out = 0; } if(*begin==0) ed_ringbell(); } else { while (*com) { *out++ = ' '; out = strcopy(out,fmtx(*com++)); } } if(ep->e_nlist) { cp = com[-1]; if(cp[strlen(cp)-1]!='/') { if(var=='$' && begin[-1]=='{') *out = '}'; else *out = ' '; out++; } else if(out[-1] =='"' || out[-1]=='\'') out--; *out = 0; } *cur = (out-outbuff); /* restore rest of buffer */ if(left) out = strcopy(out,left); *eol = (out-outbuff); } done: sh_offstate(SH_FCOMPLETE); if(!ep->e_nlist) stakset(ep->e_stkptr,ep->e_stkoff); if(nomarkdirs) sh_offoption(SH_MARKDIRS); #if SHOPT_MULTIBYTE { register int c,n=0; /* first re-adjust cur */ c = outbuff[*cur]; outbuff[*cur] = 0; for(out=outbuff; *out;n++) mbchar(out); outbuff[*cur] = c; *cur = n; outbuff[*eol+1] = 0; *eol = ed_internal(outbuff,(genchar*)outbuff); } #endif /* SHOPT_MULTIBYTE */ return(rval); }
// // File name generation for edit modes. // Non-zero exit for error, <0 ring bell. // Don't search back past beginning of the buffer. // Mode is '*' for inline expansion. // Mode is '\' for filename completion. // Mode is '=' cause files to be listed in select format. // int ed_expand(Edit_t *ep, char outbuff[], int *cur, int *eol, int mode, int count) { struct comnod *comptr; struct argnod *ap; char *out; char *av[2], *begin; char *dir = NULL; int addstar = 0, rval = 0, var = 0, strip = 1, narg = 0; int nomarkdirs = !sh_isoption(ep->sh, SH_MARKDIRS); Shell_t *shp = ep->sh; char **com = NULL; sh_onstate(shp, SH_FCOMPLETE); if (ep->e_nlist) { if (mode == '=' && count > 0) { if (count > ep->e_nlist) return -1; mode = '?'; av[0] = ep->e_clist[count - 1]; av[1] = 0; } else { stkset(shp->stk, ep->e_stkptr, ep->e_stkoff); ep->e_nlist = 0; } } comptr = stkalloc(shp->stk, sizeof(struct comnod)); ap = (struct argnod *)stkseek(shp->stk, ARGVAL); { // Adjust cur. int c; genchar *cp; cp = (genchar *)outbuff + *cur; c = *cp; *cp = 0; *cur = ed_external((genchar *)outbuff, (char *)stkptr(shp->stk, 0)); *cp = c; *eol = ed_external((genchar *)outbuff, outbuff); } out = outbuff + *cur + (sh_isoption(shp, SH_VI) != 0); #if 0 if(out[-1]=='"' || out[-1]=='\'') { rval = -(sh_isoption(shp,SH_VI)!=0); goto done; } #endif comptr->comtyp = COMSCAN; comptr->comarg = ap; ap->argflag = (ARG_MAC | ARG_EXP); ap->argnxt.ap = NULL; ap->argchn.cp = NULL; { char *last = out; Namval_t *np = nv_search("COMP_KEY", shp->var_tree, 0); if (np) STORE_VT(np->nvalue, i16, '\t'); np = nv_search("COMP_TYPE", shp->var_tree, 0); if (np) STORE_VT(np->nvalue, i16, mode == '\\' ? '\t' : '?'); var = mode; begin = out = find_begin(outbuff, last, 0, &var); if (ep->compdict && mode != '?' && (com = prog_complete(ep->compdict, outbuff, out, *cur))) { char **av; for (av = com; *av; av++) { ; // empty loop } narg = av - com; } // Addstar set to zero if * should not be added. if (var == '$') { sfwrite(shp->stk, "${!", 3); sfwrite(shp->stk, out, last - out); sfwrite(shp->stk, "$@}", 2); out = last; } else { addstar = '*'; while (out < last) { char c = *out; if (c == 0) break; if (isexp(c)) addstar = 0; if (c == '/') { if (addstar == 0) strip = 0; dir = out + 1; } sfputc(shp->stk, c); out++; } } if (mode == '?') mode = '*'; if (var != '$' && mode == '\\' && out[-1] != '*') addstar = '*'; if (*begin == '~' && !strchr(begin, '/')) addstar = 0; sfputc(shp->stk, addstar); ap = (struct argnod *)stkfreeze(shp->stk, 1); } if (mode != '*') sh_onoption(shp, SH_MARKDIRS); { char *cp = begin, *left = NULL; int cmd_completion = 0; int size = 'x'; while (cp > outbuff && ((size = cp[-1]) == ' ' || size == '\t')) cp--; if (!var && !strchr(ap->argval, '/') && ((cp == outbuff && shp->nextprompt == 1) || (strchr(";&|(", size) && (cp == outbuff + 1 || size == '(' || cp[-2] != '>') && *begin != '~'))) { cmd_completion = 1; sh_onstate(shp, SH_COMPLETE); } if (ep->e_nlist) { narg = 1; com = av; if (dir) begin += (dir - begin); } else { if (!com) com = sh_argbuild(shp, &narg, comptr, 0); // Special handling for leading quotes. if (begin > outbuff && (begin[-1] == '"' || begin[-1] == '\'')) begin--; } sh_offstate(shp, SH_COMPLETE); // Allow a search to be aborted. if (shp->trapnote & SH_SIGSET) { rval = -1; goto done; } // Match? if (*com == 0 || ((narg <= 1 && (strcmp(ap->argval, *com) == 0)) || (addstar && com[0][strlen(*com) - 1] == '*'))) { rval = -1; goto done; } if (mode == '\\' && out[-1] == '/' && narg > 1) mode = '='; if (mode == '=') { if (strip && !cmd_completion) { char **ptrcom; for (ptrcom = com; *ptrcom; ptrcom++) { // trim directory prefix *ptrcom = path_basename(*ptrcom); } } sfputc(sfstderr, '\n'); sh_menu(shp, sfstderr, narg, com); sfsync(sfstderr); ep->e_nlist = narg; ep->e_clist = com; goto done; } // See if there is enough room. size = *eol - (out - begin); if (mode == '\\') { int c; if (dir) { c = *dir; *dir = 0; } if (dir) *dir = c; // Just expand until name is unique. size += strlen(*com); } else { char **tmpcom = com; size += narg; while (*tmpcom) { cp = fmtx(shp, *tmpcom++); size += strlen(cp); } } // See if room for expansion. if (outbuff + size >= &outbuff[MAXLINE]) { com[0] = ap->argval; com[1] = 0; } // Save remainder of the buffer. if (*out) left = stkcopy(shp->stk, out); if (cmd_completion && mode == '\\') { cp = *com++; out = stpcpy(begin, path_basename(cp)); } else if (mode == '*') { if (ep->e_nlist && dir && var) { if (*cp == var) { cp++; } else { *begin++ = var; } out = stpcpy(begin, cp); var = 0; } else { out = stpcpy(begin, fmtx(shp, *com)); } com++; } else { out = stpcpy(begin, *com++); } if (mode == '\\') { char *saveout = ++out; while (*com && *begin) { if (cmd_completion) { out = overlaid(begin, path_basename(*com++), false); } else { out = overlaid(begin, *com++, false); } } mode = (out == saveout); if (out[-1] == 0) out--; if (mode && out[-1] != '/') { if (cmd_completion) { Namval_t *np; // Add as tracked alias. Pathcomp_t *pp; if (*cp == '/' && (pp = path_dirfind(shp->pathlist, cp, '/')) && (np = nv_search(begin, shp->track_tree, NV_ADD))) { path_alias(np, pp); } out = stpcpy(begin, cp); } // Add quotes if necessary. if ((cp = fmtx(shp, begin)) != begin) out = stpcpy(begin, cp); if (var == '$' && begin[-1] == '{') { *out = '}'; } else { *out = ' '; } *++out = 0; } else if ((cp = fmtx(shp, begin)) != begin) { out = stpcpy(begin, cp); if (out[-1] == '"' || out[-1] == '\'') *--out = 0; } if (*begin == 0 && begin[-1] != ' ') ed_ringbell(); } else { while (*com) { *out++ = ' '; out = stpcpy(out, fmtx(shp, *com++)); } } if (ep->e_nlist) { cp = com[-1]; if (cp[strlen(cp) - 1] != '/') { if (var == '$' && begin[-1] == '{') { *out = '}'; } else { *out = ' '; } out++; } else if (out[-1] == '"' || out[-1] == '\'') { out--; } *out = 0; } *cur = (out - outbuff); // Restore rest of buffer. if (left) out = stpcpy(out, left); *eol = (out - outbuff); } done: sh_offstate(shp, SH_FCOMPLETE); if (!ep->e_nlist) stkset(shp->stk, ep->e_stkptr, ep->e_stkoff); if (nomarkdirs) sh_offoption(shp, SH_MARKDIRS); { // First re-adjust cur. int c, n = 0; c = outbuff[*cur]; outbuff[*cur] = 0; for (out = outbuff; *out; n++) mb1char(&out); outbuff[*cur] = c; *cur = n; outbuff[*eol + 1] = 0; *eol = ed_internal(outbuff, (genchar *)outbuff); } return rval; }